从cron运行php没有以CLI身份运行

时间:2013-11-11 22:09:57

标签: php cron

我注意到这个问题是在一个php脚本从cron开始运行到超时之后但是当从命令行手动运行时它不是问题。 (默认情况下,PHP的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 | 

1 个答案:

答案 0 :(得分:14)

我怀疑你的问题在于缺少一个环境变量,特别是那个非常重要的$PATH。当你运行它:

php -q /tmp/phpinfo.php

系统必须通过php计算出你的意思。它通过按顺序查看当前$PATH环境变量中的目录来完成此操作。

从普通shell执行,您的环境设置方式使其能够找到您所期望的PHP的CLI版本。

但是,当cron执行命令时,它会在没有交互式shell设置的所有环境变量的情况下执行。由于系统上可能存在其他名为php的可执行文件,对于不同的“SAPI”,根据您报告的输出,它可能会选择“错误的” - 在您的情况下,cgi-fcgi可执行文件来自php_sapi_name()

要解决此问题,请先键入以下命令,在普通shell中找到正确的php可执行文件的路径:

which php

这会给你一条像/usr/bin/php这样的路径。您可以进一步检查这是否实际上是指向不同文件名的“符号链接”:

ls -l $(which php)

(如果是,则会在输出中看到箭头,如/usr/bin/php -> /usr/bin/php5-cli

然后获取PHP可执行文件的完整路径并在crontab条目中使用它,所以它看起来像这样:

50 8 * * * /usr/bin/php5-cli -q /tmp/phpinfo.php > /tmp/phpinfo