如何使用自定义php.ini覆盖php cli配置


How to override php cli configuration with custom php.ini

我正在努力用自定义php.ini

覆盖php cli配置

我的自定义php.ini

max_execution_time = 90
memory_limit = 256M
safe_mode = Off

运行php cli

php -c /home/env/php.ini -r 'phpinfo();' | grep 'memory_limit'

输出
memory_limit => 256M => 256M

然而,自定义php.ini似乎没有覆盖max_execution_time和safe_mode,因为它输出0和On,而不是90和Off。

运行这个简单的脚本

#!/usr/bin/php -c /home/env/php.ini
<?php echo 'memory_limit: ' . ini_get('memory_limit');

输出默认的cli配置(128M),而不是预期的256M。

运行这个简单的脚本

#!/usr/bin/php -d max_execution_time=90
<?php echo 'max_execution_time: ' . ini_get('max_execution_time');

按预期输出90。

到目前为止,我只在运行时覆盖了一个配置指令,所以任何帮助都非常感谢如何覆盖多个配置指令。

编辑:

php -a
php > parse_ini_file('/home/env/php.ini');

没有输出错误,所以我想我的自定义php.ini是可以的。我只是发现执行

#!/usr/bin/php -c /home/env/php.ini
<?php echo 'memory_limit: ' . ini_get('memory_limit'); phpinfo();

表示已加载的配置文件=> (none)。这似乎就是问题所在。PHP CLI似乎没有加载我的自定义PHP .ini文件,即使路径是正确的,语法似乎也很好。

解决方案:

似乎不可能在运行时用shebang覆盖多个配置指令,至少对我来说是这样。但是删除shebang并执行以下命令为我解决了这个问题。

php -d max_execution_time=90 -d memory_limit=256M -d safe_mode=Off -f test.php

我试图通过CLI设置max_execution_time,我无法做到这一点。

从文档中我了解到它是硬编码的,不能在CLI环境中更改。

无论如何,我发现timeout命令很有用:

timeout 60 php -d memory_limit=1024M script.php

尝试将"safe_mode = Off"行作为自定义文件中的第一行。如果我没记错的话,PHP会按照出现的顺序解析ini文件中的值。

也就是说,只要在每个php.ini中禁用safe_mode,如果你的服务器允许这样做,并且不再依赖该特性。之后,在代码中使用ini_set函数来更改您喜欢的任何内容,您喜欢多少变量。我发现在脚本本身中拥有脚本所需的配置比通过额外的命令行参数或ini文件更好。

仅供参考,PHP安全模式已从PHP 5.4版本中删除,因此在旧版本中禁用它是在升级到新版本时减少问题的好做法。