2011-12-16 26 views
0

我已經設置了一個每天運行腳本的cronjob。該腳本從數據庫中提取一列ID,循環遍歷每個ID以從數據庫獲取更多數據,並基於檢索到的數據生成XML文件。檢查cron作業已正確運行腳本 - 在批處理中記錄錯誤的正確方法

這似乎在前幾天運行良好,但是,ID列表變得越來越大,今天我注意到並非所有的XML文件都已經生成。它似乎是沒有運行的隨機ID。我已經手動運行腳本爲單獨生成的一些缺失ID生成XML,並且運行時沒有任何問題。

我不確定如何定位問題,因爲cron作業正在運行,但並不總是生成所有的XML文件。任何想法,我如何能指出這個問題,並迅速找出哪些文件尚未運行。

我想也許添加timestarttimeend領域的數據庫,然後輸入每個XML生成的開始和結束這些價值正在運行,這樣我可以看到發生了什麼跑,什麼沒有,但想知道是否有一個更好的方法。

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

} 
+0

這是一個糟糕的主意,如果所有的記錄都是可以關係的,使用(INNER)JOIN – ajreal 2011-12-16 11:24:45

+0

不好主意?請解釋。數據庫是完全獨立的。 – LeeTee 2011-12-16 12:49:12

回答

0

轉身出了阿帕奇超時。因此與使用函數或exec()函數無關。

1

我的建議是將一些日誌記錄添加到腳本中。一個簡單的

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

可以給你一些關於ID是否被傳遞的信息。如果您發現這種情況,您可以將日誌記錄引入index.php以進一步評估問題。

順便說一句,你能解釋爲什麼你使用exec()來運行一個PHP腳本?爲什麼不在循環中執行一個函數?這可能是問題的根源。

因爲使用exec,我認爲這個過程會在後臺運行,並且循環會繼續,所以你可能真的會用這種方式扼住你的服務器,或許這也值得嘗試。 (我想這也取決於輸出方式:

注:如果程序開始使用此功能,以便它繼續在後臺運行,該程序的輸出必須重定向到一個文件或其他輸出流。如果不這樣做會導致PHP掛起,直到該程序的執行結束。

也許一些其他用戶可以在此發表評論。

相關問題