【问题标题】:PHP cron job vs. access through web browserPHP cron 作业与通过 Web 浏览器访问
【发布时间】:2011-12-23 00:32:42
【问题描述】:

我有一个 PHP 脚本,它解析 RSS 提要并在数据库中输入信息。我正在使用 PHP5。

这是一个 .php 页面,当通过网络服务器和浏览器访问时,它就像一个魅力。 (http://myhost.com/rssjob.php)

现在我想将它设置为 CRON 作业 - 但是当我通过 SSH/CRON 作业执行它时 - 它会在以下代码中引发类似“为 foreach() 提供的参数无效”之类的异常。

问题: 1. 为什么我通过访问 PHP 页面得到的结果中有一个 delta 抛出浏览器,当我尝试将它作为 CRON 作业/SSH 命令行执行时?当通过 SSH/命令行/cron 作业访问时,我应该为 php 页面指定更多内容吗?

$xml = parseRSS("http://www.myhost.com/rss/");

//SAMPLE USAGE OF 
foreach($xml['RSS']['CHANNEL']['ITEM'] as $item) {
        //echo("<p>");
    $title = $item['TITLE'];

    $description = $item['DESCRIPTION'];

【问题讨论】:

  • 如果不提供无效的争论,很难知道发生了什么。尽管它可能与 Apache 加载的 php.ini 不同,但记住它可能很有用。可能是 php.ini 中的某些东西阻止了 http://.../ 请求或类似的东西。您是否遇到任何其他错误?
  • 你为什么不给我们看 print_r($xml)?

标签: php cron


【解决方案1】:

一个快速的解决方案(hack)是通过 HTTP 从 cron 调用你的脚本:

? * * * * curl http://PATH.TO.YOUR/script.php

【讨论】:

    【解决方案2】:

    通过 cron 与 web 运行脚本有几个不同之处。例如,cron 将没有 $_SERVER['DOCUMENT_ROOT'] 变量。 如果您在脚本中使用它,这可能会破坏它。

    我不确定在您的示例行之前会发生什么,但由于某种原因,$xml 不是您期望的数组,并且就像它出现在网络版本中一样。 请检查 $xml 变量在从 cron 运行时的值。 确定脚本是否从命令行/cron 运行的一种简单方法是:

    $cron = (bool) defined('STDIN');
    

    【讨论】:

    • 我可能会做 PHP_SAPI === 'cli' 而不是检查是否定义了 STDIN。
    猜你喜欢
    • 2015-09-27
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 2014-12-26
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    相关资源
    最近更新 更多