【问题标题】:Calling PHP script from cron - does echo cause errors?从 cron 调用 PHP 脚本 - echo 会导致错误吗?
【发布时间】:2013-06-02 09:47:47
【问题描述】:

我有一个 PHP 脚本,用于在网站上执行维护任务。 我使用 cron 每 X 小时执行一次,但如果站点管理员想要手动运行它,我也希望将它作为一个选项。为了使其管理员友好,最后它应该通过回显各种消息在浏览器中显示结果。

问题是,脚本在 cron 中运行时是否会回显结果,或者会导致错误?它应该只在管理员执行时输出到浏览器吗?有没有办法判断脚本何时在浏览器中执行以及何时从 cron 执行?

谢谢。

【问题讨论】:

  • 您可以将参数传递给您通过 cron 执行的 php 文件。例如,当使用 cron 时为 example.php?cron=1,当通过 web 时只有 example.php。然后在 php 文件中给出一个 if 语句来检查它。如果您在屏幕上回显任何内容,那么 cron 会将响应存储到您的 ftp 服务器上的不同文件中。
  • 将 ` >& /dev/null ` 添加到您的 cron cmd

标签: php cron


【解决方案1】:

cron 脚本的输出通常会邮寄给服务器管理员。由于这可能很烦人,如果没有发生错误,您通常不希望有任何输出。

您可以php_sapi_name() 检查使用了哪种类型的接口(“cli”用于 cron 作业)。

请参阅php docs

由于其他答案建议将输出重定向到 /dev/null 您应该记住,您将无法知道是否发生了任何错误。你的 cronjob 可能会停止工作,而你很长一段时间都不知道......

【讨论】:

    【解决方案2】:

    如果 cron 作业在 stderr 或 stdout 上有任何输出,则 cron 将把该输出通过电子邮件发送给 cron 作业用户,或在 cron 文件中最后设置的 MAILTO 变量中给出的地址。

    您通常应该编写您的 cron 作业/脚本,以便它不会产生任何输出,除非出现问题。这是一个哭狼的事情。如果你的 cron 工作总是很吵,你就不会在需要的时候注意。

    因此,有几种可能的方法,在从命令行运行时仍能提供信息丰富的输出:

    1. 您可以将信息性错误消息写入标准输出,并将标准错误保留给真正需要引起注意的事情。然后,您可以让您的 cron 作业规范通过管道将标准输出传输到 /dev/null

    2. 您可以使用命令行选项来打开或关闭输出。例如 --verbose 或 --quiet。

    可以测试终端是否存在,但我认为您最好使用上述方法之一。那么这种行为就不那么令人惊讶了。

    【讨论】:

      【解决方案3】:

      不会有问题的。

      echo 命令将使用 php 的标准输出。如果您在控制台中执行 php 脚本,echo 将在控制台中打印其结果。

      我相信 crontab 的标准输出可能取决于它的 unix 分布。

      does echo equal fputs( STDout )?。这个问题有一些有价值的信息。

      【讨论】: