【发布时间】:2020-05-24 15:55:13
【问题描述】:
在从 cron 运行的 php 脚本开始超时后,我注意到了这个问题,但从命令行手动运行它不是问题。 (PHP 的 CLI 的 max_execution_time 默认为 0)
所以我尝试运行一个简单的 cron,例如:
50 8 * * * php -q /tmp/phpinfo.php > /tmp/phpinfo
脚本只会调用 phpinfo()。
令人惊讶的是它以 html 格式写出了 phpinfo,这表明它不是作为 CLI 运行的。并且 max_execution_time 在输出中是 30。
从命令行手动运行脚本
php -q /tmp/phpinfo.php | less
以文本格式写出 php 信息,输出中 max_execution_time 为 0。
我知道某处肯定存在配置问题,但我就是找不到问题所在。这发生在我完全控制的生产服务器上。在我的开发机器上从 cron 运行相同的脚本效果很好。
这里是区别的总结
function | CLI | cron |
php_sapi_name | cli | cgi-fcgi |
php_ini_loaded_file | /usr/local/lib/php.ini | /usr/local/lib/php.ini |
【问题讨论】:
-
要确认它是否真的处于 CLI 模式,请尝试回显
php_sapi_name()。您还可以检查php_ini_loaded_file()和php_ini_scanned_files中包含的php.ini。此类差异的最常见原因是您为普通 shell 设置了一些“环境变量”,当 cron 运行时不会设置这些“环境变量”。 -
不,这是不正确的。这来自 phpinfo 文档页面“注意:使用 CLI 模式时,phpinfo() 输出纯文本而不是 HTML。”
-
去掉
-q标志。您不需要它,它甚至可能是导致此问题的原因。 -
-q 不是问题。这是一个安静模式,是的,我已经尝试删除它。
-
我很想知道从 shell 运行 cli 和 cgi-fcgi 之间可能存在的其他差异。这是来自 php.net 的列表:us.php.net/manual/en/features.commandline.differences.php