2011-10-24 63 views
0

我寫了一個PHP腳本,使用ftp_put將目錄中的圖像上傳到遠程服務器。我已經使用任務調度程序和wget將其設置爲cron。最初它運行良好,但過了一段時間,不知道該進程凍結的具體時間,由「Windows任務計劃程序」說明它正在運行作業,但沒有照片不再上傳。長時間運行的php腳本作爲cron失敗

最初我以爲問題是由於max_execution_time,但我已設置爲24小時通過使用set_time_limit(3600 * 24);我已將max_input_time設置爲600秒(10分鐘)。

爲什麼不完成任務?

下面是代碼:

if($conn){ 
    if (is_dir($imagesPath)){ 
     if($files = opendir($imagesPath)){ 
      while(($file = readdir($files)) !== false){ 
       if($file != "." && $file != ".." && preg_match("/\.jpg|\.JPG|\.gif|\.GIF|\.png|\.PNG|\.bmp|\.BMP/",$file) && date("Ymd",filemtime($imagesPath.'/'.$file)) >= date("Ymd",strtotime(date("Y-m-d")." -".$days." day"))){ 
        if(ftp_put($conn, $remotePath.$file, $imagesPath.'/'.$file, FTP_BINARY)){ 
         //echo $file; 
         $counter++; 
        } 
        else{ 
         echo '<br>'.$imagesPath.'/'.$file; 
        } 
       } 
      } 
      closedir($files); 
      echo $counter.' Files Uploaded on '.date("Y-m-d"); 
     } 
     else{ 
      echo 'Unable to read '.$imagesPath; 
     } 
    } 
    else{ 
     echo $imagesPath.' Does not exist'; 
    } 
    ftp_close($conn); 
}else{ 
    echo "Failed to connect"; 
} 
/* End */ 
exit; 

補充:

/* Settings */ 
// Set Max Execution time 
set_time_limit(3600*24); 

在腳本的頂部。

謝謝。

+2

你有沒有檢查日誌?你有沒有設置cron作業來保存輸出到某個日誌文件? –

+0

沒有看到代碼,不可能說。讓腳本在每個主要狀態下吐出一些調試/日誌記錄語句,並查看鎖定前的最後階段。 –

+0

嘗試關閉任務並添加調試消息,以便您可以查看連接是否失敗或上載等。 - 可能上傳限制(允許的總存儲空間)是否達到某個點? - 我想我們需要更多信息。 – Smamatti

回答

0

我的工作類似的東西,我發現以下幫助:

1)確保每一步都是有條件的,所以如果事情無法加載(如圖像,FTP連接等)的程序繼續運行(迭代)。

2)在文件末尾(或困難步驟之間)設置一個小的sleep()。我也將它用於圖像,並且當圖像的連接延遲或「圖像寫入」時間滯後時會有所幫助。

3)設置調度程序經常執行腳本(我的每天2次),但只要您選中該框,它可以設置爲小時:如果腳本已在運行,則不啓動新實例

4)根據服務器的設置,檢查可能中斷腳本運行時的其他任務。這並不總是PHP的問題。只要你有適當的計劃任務重新執行腳本,你應該沒問題。

5)爲了方便調試,而不是echo語句(最有可能在您的cmd窗口中顯示)使用簡單的文件日誌記錄($message = fopen($myLogFile, 'w');)以外的「不存在」或「無法連接」語句幷包含更多詳細信息,以便在失敗時可以轉至日誌文件並查看失敗的時間和原因。

6)您可以嘗試使用無限循環(while (true) { ... your code... })而不是the set_time_limit()

我希望這有助於:)

相關問題