6

在从 cron 运行的 php 脚本开始超时后,我注意到了这个问题,但是从命令行手动运行它不是问题。(对于 CLI,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 | 
4

1 回答 1

14

我怀疑您的问题在于缺少环境变量,特别是最重要的$PATH. 当你运行这个:

php -q /tmp/phpinfo.php

系统必须弄清楚您所说的程序是什么php。它通过按顺序查看当前$PATH环境变量中的目录来做到这一点。

从普通 shell 执行,您的环境设置为它可以找到 PHP 的 CLI 版本,正如您所期望的那样。

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

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

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
于 2013-11-11T22:47:18.497 回答