【问题标题】:Running php from cron did not run as CLI从 cron 运行 php 没有作为 CLI 运行
【发布时间】: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

标签: php cron


【解决方案1】:

我怀疑您的问题在于缺少环境变量,特别是最重要的$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

【讨论】:

  • 这正是问题所在。谢谢你的建议。我最终在 cron 的顶部添加了以下内容,这样我就不需要更改命令了。 PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
  • 这也适用于我,将“php”更改为“/usr/local/bin/php”,我的输出来自“which php”,它现在作为 CLI 从 cron 运行。
  • 很棒的信息,非常感谢帮助!虽然它最终对我的问题没有帮助,但为什么 CRON PHP 在没有正确掩码 S_IFCHR 的情况下运行,而是将 (STDIN) 显示为 S_IFIFO。
猜你喜欢
  • 2018-06-11
  • 1970-01-01
  • 2012-05-09
  • 2012-08-18
  • 2014-01-07
  • 1970-01-01
  • 2017-03-09
  • 2012-06-19
  • 1970-01-01
相关资源
最近更新 更多