2012-11-12 92 views
14

我正在編寫一個PHP腳本,做一些後端的東西,需要運行每8小時左右。該腳本需要一段時間才能執行。對於它而言,我從瀏覽器嘗試了它,並且在腳本終止之前,與服務器的連接重置得很好。我的問題是 - 如果我直接運行它,即。 php -a file.php作爲cron作業,執行時是否存在任何內部時間限制?該腳本可能需要2-5分鐘才能完成並且不能被打斷。我從來沒有這樣做過,所以我不知道如果php運行繁重的腳本時有怪癖。運行php腳本作爲cron作業 - 超時問題?

+1

檢查[參數或者set_time_limit(http://php.net/manual/en/function.set-time-limit.php) – Vatev

+1

CLI稱爲PHP腳本沒有時間限制。但共享主機可能會停止需要超過X秒的進程 - 這將如何託管? – 2012-11-12 22:11:20

+0

請參閱:http://www.php.net/manual/en/info.configuration.php#ini.max-execution-time,CLI中沒有時間限制 –

回答

24

正如之前所說,CLI腳本在默認情況下沒有時間限制。

但我也想提一個替代你的cron作業方式:
您可以從網絡服務器控制下的PHP腳本fork一個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腳本,你會收到這些PARAMS這樣的...

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

...,並與他們做任何事這將需要很長時間的網絡服務器控制下。

這種技術同樣適用於* nix中和Windows環境。

+0

非常有幫助,謝謝Jpsy。 –

4

否有來自命令行執行的PHP時是在PHP本身沒有時間限制。

但可以有其他超時,喜歡的MySQL連接。因此,如果您的代碼中有一個mysql連接,請確保將其保持爲活動狀態,或將您的mysql超時設置爲足夠高以運行您的代碼。另一件事:我見過一些webhosting提供程序殺死運行多分鐘的php應用程序。所以請確保你的提供者不這樣做。

3

由於默認情況下,PHP腳本30秒可以通過編輯php.ini中或在你的腳本的頂部添加此重寫後timesout。

set_time_limit(0); 

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

此外,

您可以添加到您的腳本,並在瀏覽器中打開它來啓動腳本,因爲如果你在瀏覽器中打開它,並保持瀏覽器中打開它將會運行。

ignore_user_abort(); 

它只是在後臺運行腳本。這兩個對你都有用。

地址:當腳本從命令行運行,CLI,默認的超時值爲0(無超時)

+4

錯誤,cli腳本的默認值爲0。 http://www.php.net/manual/en/features.commandline.differences.php – 2012-11-12 22:16:58

+0

好的,點了。據我所知,什麼有30秒默認超時呢? – Kishor

+2

「不是命令行」的默認值爲30.「這設置腳本在解析器終止前允許運行的最長時間(以秒爲單位),這有助於防止編寫不當的腳本佔用服務器。是30.從命令行運行PHP的默認設置是0.「http://www.php.net/manual/en/info.configuration.php#ini.max-input-time – 2012-11-12 22:20:03