2012-12-14 34 views
0

我在使用cronjob的共享服務器上運行非常慢的PHP腳本。 (該腳本執行暫時在服務器上執行的一些HTTP請求......它在〜15-20秒內完成執行。)以非阻塞模式從cronjob執行PHP腳本

問題是,cronjob不時終止,幫助臺的共享服務器告訴我,它不應該連續運行超過5秒。

所以我認爲(在開始認真優化任務之前)執行腳本並在腳本繼續運行時立即返回。直到現在我想到了兩種方法:

  1. Cronjob不會等待PHP腳本完成它的工作。
  2. Cronjob將執行一個虛擬的PHP腳本,它將調用主PHP腳本並立即返回,而無需等待第二個腳本返回。

我讀過有關在網絡上,尤其是在這個網站上這兩個選項,並沒有發現的東西,真正起作用:multi_curl沒有做任何事情,如果立即將第一個腳本完成...

提前致謝。


編輯與可能的解決方案我剛剛想出了:

header("Content-Length: 0"); 
header("Connection: close"); 
flush(); 

$mainUrl = 'mySecondScript.php'; 

$active= null; 
$mch = curl_multi_init(); 
$ch1 = curl_init($mainUrl); 
curl_setopt($ch1, CURLOPT_HEADER, 0); 

curl_multi_add_handle($mch, $ch1); 
$resultCurl = curl_multi_exec($mch, $active); 

do { 
$resultCurl = curl_multi_exec($mch, $active); 
} while ($resultCurl == CURLM_CALL_MULTI_PERFORM); 

它可能類似的代碼,你可能熟悉這裏或從網上其他地方 - 但它不會,如果我的工作像其他人爲我寫的那樣使用它 - 只有這樣!

回答

1

如果PHP運行在您的託管用戶具有執行權限,你可以使用shell_exec和&,使其運行後臺進程,所以像這樣在你的PHP文件:shell_exec('/path/to/php /path/to/file >/dev/null 2>&1 &')

+0

感謝Michoel,我我之前試過它,並且由於某種原因它導致了大約50次循環調用我的第一個腳本 - 這是一個我無法解釋的現象(我所有的第一個腳本工作都在調用第二個腳本,但它沒有。) 反正其間我我認爲我發現了一個髒兮兮的解決方案,這個解決方案是由我之前使用過的兩個快照合成的(兩者都沒有像現在這樣工作),我會編輯我的第一條消息,也許它會幫助其他人或者可以改進我的修復。 – Yizhar