检查cron job是否正确运行脚本 - 在批处理中记录错误的正确方法

时间:2011-12-16 11:19:34

标签: php error-handling cron batch-processing

我已经设置了一个cronjob来每天运行一个脚本。该脚本从数据库中提取Ids列表,循环遍历每个数据库以从数据库获取更多数据,并根据检索到的数据生成XML文件。

这在最初的几天似乎运行良好,但是,ID的列表越来越大,今天我注意到并非所有的XML文件都已生成。它似乎是未运行的随机ID。我已经手动运行脚本来单独为一些缺失的ID生成XML,并且它们没有任何问题地运行。

我不确定如何定位问题,因为cron作业肯定在运行,但并不总是生成所有XML文件。关于我如何能够指出这个问题并快速找出哪些文件尚未运行的任何想法。

我想也许可以将timestarttimeend字段添加到数据库中,并在每个正在运行的XML生成器的开头和结尾输入这些值,这样我就可以看到已经运行的内容和什么没有了t,但想知道是否有更好的方法。

set_time_limit(0);

//connect to database
$db = new msSqlConnect('dbconnect');

$select = "SELECT id FROM ProductFeeds WHERE enabled = 'True' ";

$run = mssql_query($select);
while($row = mssql_fetch_array($run)){

    $arg = $row['id'];
    //echo $arg . '<br />';
    exec("php index.php \"$arg\"", $output);
    //print_r($output);

}

2 个答案:

答案 0 :(得分:1)

我的建议是在脚本中添加一些日志记录。一个简单的

error_log("Passing ID:".$arg."\n",3,"log.txt");

可以提供有关是否传递ID的一些信息。如果您发现是这种情况,您可以将记录引入index.php以进一步评估问题。

顺便问一下,你能解释为什么你用exec()来运行php脚本吗?为什么不在循环中执行函数。这很可能是问题的根源。

因为有了exec,我认为这个过程会在后台运行,循环会继续,所以你可以用这种方式扼杀服务器,也许这也值得一试。 (我认为这也取决于输出的方式:

  

注意:如果使用此功能启动程序,为了使程序在后台继续运行,程序的输出必须重定向到文件或其他输出流。如果不这样做将导致PHP挂起,直到程序执行结束。

也许其他一些用户可以对此发表评论。

答案 1 :(得分:0)

原来这个apache已经超时了。因此,与使用函数或exec()函数无关。