在脚本中使用ini_set被认为是不好的做法


Is using ini_set in a script considered bad practice?

我正在做一个代码审查,发现两个地方

ini_set('memory_limit', '512M');

用于函数中。这样可以吗?不知怎的,我觉得这似乎不对。这被认为是不好的做法吗?

谢谢!

没什么问题。考虑一个场景,其中memory_limit在PHP的ini文件中被全局设置,并且您希望仅为一个特定的脚本/请求覆盖该设置,以允许操作使用更多内存。

在PHP脚本中调用ini_set只会在PHP执行该特定请求时生效。

您可以选择将此函数调用包装在另一个被调用的函数中,以便在将来出现更好的方法时可以更改实现,或者如果您想要轻松地全局更新内存限制

function setMemory($limit = '512M') {
    ini_set('memory_limit', $limit);
}

我的意见(你问的意见,我想):

[开始意见]

使用ini_set('memory_limit', ....);

但我总是把这样的声明放在我的脚本的顶部(如果它是内存饥饿),而不是在一个函数…

如果你养成了在函数中改变内存需求的习惯,我想如果在同一个脚本中调用许多函数,可能很难弄清楚当前的设置是什么。

因此,对于代码审查来说,如果这种情况发生一两次,这并不是一个非常糟糕的做法,但如果你经常遇到这种情况,我会发出危险信号。

[最终意见]

还不错。因为你可能无法访问php。ini

在任何想法的开始使用脚本往往是一种不好的做法,但如果您正在设置属性,如内存,如果您试图执行其他脚本,则不那么糟糕。

如果您使用的脚本需要512M,并且您没有权限在php.ini上更改此设置,则可以使用ini_set

注意:相同的PHP脚本可以由多个用户运行
如果您有10个用户正在运行您的脚本,您的服务器可能会耗尽内存:10 X 512M = 5120M = 5G,所以要小心!


使用ini_set()函数不被认为是一个坏的做法,但你必须遵循一些规则,以保持干净:

将所有的ini_set()集中在同一个配置文件中
custom_ini_set.php

function custom_ini_set($script_path_name_s) {
        switch ($script_path_name_s) {
            case '/dir1/sub_dir1/script1.php' : {
                ini_set('memory_limit', '512M');
                break;
            }
            case '/dir1/sub_dir2/script2.php' : {
                ini_set('memory_limit',         '256M');
                ini_set('max_execution_time',   128);
                break;
            }
            // ...
        }
    }

在需要更多资源的脚本中调用这个函数:

require_once   ('custom_ini_set.php');
custom_ini_set (__FILE__);

最好放在XML文件中而不是PHP文件中:)