手动运行,但不是cron

时间:2009-12-06 13:44:47

标签: php cron

php脚本有问题需要获取URL的标题。它在我手动运行时有效,但在我通过cron运行时无效。

用Google搜索获取一个小脚本来获取网址标题:

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);
}

然后我运行以下内容,在文本中查找网址,并打印带有标题的网址:

$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”解释为真。

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

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

欢迎任何帮助或想法!

1 个答案:

答案 0 :(得分:2)

通常会发生这种情况,因为您的cron中有不同的环境(或者当您以其他用户身份运行时)。

当您在命令行中运行它时,您可以通过运行“env”来阅读不同的环境。

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

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

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

例如,

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

在调试时运行error_reporting(E_ALL)可以在这里提供帮助。