一个php脚本从cron开始运行到超时之后我注意到了这个问题,但是当它从命令行手动运行时不是问题.(默认情况下,CLI的max_execution_time为0)
所以我试着运行一个简单的cron:
50 8 * * * php -q /tmp/phpinfo.php > /tmp/phpinfo
Run Code Online (Sandbox Code Playgroud)
该脚本只会调用phpinfo().
令人惊讶的是,它以html格式写出了phpinfo,这表明它不是作为CLI运行的.并且max_execution_time在输出中为30.
从命令行手动运行脚本
php -q /tmp/phpinfo.php | less
Run Code Online (Sandbox Code Playgroud)
以文本格式写出了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 |
Run Code Online (Sandbox Code Playgroud)
IMS*_*SoP 14
我怀疑你的问题在于缺少环境变量,特别是非常重要$PATH.当你运行这个:
php -q /tmp/phpinfo.php
Run Code Online (Sandbox Code Playgroud)
系统必须弄清楚你的意思是什么程序php.它通过按顺序查看当前$PATH环境变量中的目录来完成此操作.
从正常的shell执行,您的环境的设置方式使其能够像您期望的那样找到PHP的CLI版本.
但是,在cron执行命令时,它会在没有交互式shell将设置的所有环境变量的情况下执行此操作.由于php您的系统可能会调用其他可执行文件,对于不同的"SAPI" cgi-fcgi,根据您报告的输出,它可能会选择"错误的" - 在您的情况下,可执行文件php_sapi_name().
要解决此问题,请首先php通过键入以下内容找到正常shell中正确可执行文件的路径:
which php
Run Code Online (Sandbox Code Playgroud)
这应该给你一条路径/usr/bin/php.您可以进一步检查这是否实际上是指向不同文件名的"符号链接":
ls -l $(which php)
Run Code Online (Sandbox Code Playgroud)
(如果是,你会在输出中看到一个箭头/usr/bin/php -> /usr/bin/php5-cli)
然后把这个完整的路径带到PHP可执行文件并在你的crontab条目中使用它,所以它看起来像这样:
50 8 * * * /usr/bin/php5-cli -q /tmp/phpinfo.php > /tmp/phpinfo
Run Code Online (Sandbox Code Playgroud)