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。变量,但我不知道这会如何影响这个?
欢迎任何帮助或想法!
答案 0 :(得分:2)
通常会发生这种情况,因为您的cron中有不同的环境(或者当您以其他用户身份运行时)。
当您在命令行中运行它时,您可以通过运行“env”来阅读不同的环境。
您可以将环境前置变量更改为您正在运行的命令。像:
PATH = / bin:/ usr / local / bin php myprogram.php
您应该做的其他事情是在PHP脚本中启用错误报告。
例如,fopen可以返回FALSE,你必须捕获这些错误。当您将空字符串添加到表达式时会发生“$ start == 7”,因此这可能是未处理错误的结果。
在调试时运行error_reporting(E_ALL)可以在这里提供帮助。