簡體   English   中英

運行PHP腳本作為cron作業 - 超時問題?

[英]Running php script as cron job - timeout issues?

我正在編寫一個PHP腳本來做一些后端的東西,需要每8小時左右運行一次。 該腳本需要一段時間才能執行。 對於它的地獄,我在我的瀏覽器中嘗試了它,並且在腳本終止之前很快就重置了與服務器的連接。 我的問題是 - 如果我直接運行,即。 php -a file.php作為cron作業,執行時是否存在內部時間限制? 此腳本可能需要2-5分鍾才能完成,並且無法中斷。 我之前從未這樣做過,所以我不確定php在運行繁重的腳本時是否有怪癖。

如前所述,CLI腳本默認沒有時間限制。

但我還想提一下你的cron工作方法的替代方案:
您可以在Web服務器控件下從PHP腳本派生CLI PHP腳本。 我做了很多次。 如果您的腳本具有較長的執行時間(必須由某些網站用戶操作觸發)(例如,構建一個非常大的存檔文件並在文件完成時通過電子郵件發送下載鏈接),這將非常有用。 我通常使用popen()函數從Web服務器PHP腳本分叉CLI腳本。 這樣可以很好地將參數傳遞給新的腳本實例,如下所示:

$bgproc = popen('php "/my/path/my-bckgrnd-proc.php"', 'w');
if($bgproc===false){
  die('Could not open bgrnd process');
}else{
  // send params through stdin pipe to bgrnd process:
  $p1 = serialize($param1);
  $p2 = serialize($param2);
  $p3 = serialize($param3);
  fwrite($bgproc, $p1 . "\n" . $p2 . "\n" . $p3 . "\n");
  pclose($bgproc);
}

在CLI腳本中,您將收到這樣的參數...

$fp = fopen('php://stdin', 'r');
$param1 = unserialize(fgets($fp));
$param2 = unserialize(fgets($fp));
$param3 = unserialize(fgets($fp));
fclose($fp);

...並且在網絡服務器控制下花費很長時間做任何事情。

這種技術在* nix和Windows環境中同樣有效。

從命令行執行php時,php本身沒有時間限制。

但是可能還有其他超時,例如與mysql的連接。 因此,如果您的代碼中有mysql連接,請確保將其保持活動狀態或將mysql超時設置為足以運行代碼的高度。 另一件事:我看到一些網站主機提供商殺死運行超過幾分鍾的PHP應用程序。 因此,請確保您的提供商不這樣做。

默認情況下,PHP腳本在30秒后超時,可以通過編輯PHP.ini或在腳本頂部添加它來覆蓋它。

set_time_limit(0);

這為腳本設置了無限的執行時間,也就是說,除非腳本完成執行,或者服務器出現故障,或者文件被刪除或出現任何致命錯誤,否則它永遠不會結束。

另外,

您可以將其添加到腳本中並在瀏覽器中打開以啟動腳本,它將像在瀏覽器中打開並保持瀏覽器打開一樣運行。

ignore_user_abort();

它只是在后台運行腳本。 這些都對你有用。

ADD:從命令行Cli運行腳本時,默認超時為0.(No Timeout)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM