【问题标题】:Manual run works, but not cron手动运行有效,但不是 cron
【发布时间】:2010-12-23 17:58:31
【问题描述】:

获取 URL 标题的 php 脚本有问题。当我手动运行它时它可以工作,但当我通过 cron 运行它时就不行。

谷歌搜索了一个小脚本来获取 URL 的标题:

function getTitle($url) {
    $fh = fopen($url, "r");
    $str = fread($fh, 7500);
    fclose($fh);
    $str2 = strtolower($str);
    $start = strpos($str2, "<title>")+7;
    $len   = strpos($str2, "</title>") - $start;
    if ($start == 7)
            return $url;
    return substr($str, $start, $len);
}

然后我运行下面的代码,在文本中查找 url,并打印带有标题的 url:

$data = mysql_query('SELECT * FROM msgs ORDER BY id DESC LIMIT 100');
while ($rad = mysql_fetch_array($data)) {
    preg_match_all($pattern, $rad["text"], $a);
    $count = count($a[1]);
    for ($row = 0; $row < $count ; $row++) {
        echo 'URL:'.$a[1]["$row"].'<BR>';
        echo 'TITLE:'.getTitle($a[1]["$row"]).'<BR><BR>';
    }
}

以上代码位于 url.php 中。当我通过浏览器手动运行它时,它可以正常工作并打印带有正确标题的 url。但是,当我作为计划的 cron 作业运行时(每分钟一次),它会写入 url 和 url,即 getTitle 似乎总是将“$start == 7”解释为 true。

这可能与时间有关吗? fopen 和 fread 需要很多时间吗?如果是这样,我该如何解决这个问题。

我见过一个典型的 cron 问题是 env。变量,但我不明白这会如何影响这一点?

欢迎任何帮助或想法!

【问题讨论】:

  • 对了,为什么不用“DOM”解析器呢?
  • 能否将您的 crontab 中的行包含在内?

标签: php cron


【解决方案1】:

这通常是因为您的 cron 中有不同的环境(或者当您以不同的用户身份运行时)。

当你在命令行中运行它时,你有一个不同的环境,你可以通过运行“env”来读取它。

您可以将环境前置变量更改为您正在运行的命令。喜欢:

PATH=/bin:/usr/local/bin php myprogram.php

您应该做的其他事情是在您的 PHP 脚本中启用错误报告。

例如,fopen 可能会返回 FALSE,您必须捕获此类错误。 "$start == 7" 在您将空字符串添加到表达式时发生,因此这可能是未处理错误的结果。

在调试时运行 error_reporting(E_ALL) 会有所帮助。

【讨论】:

    猜你喜欢
    • 2013-11-28
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    相关资源
    最近更新 更多