2010-05-14 97 views
0

我對一些後端任務(不是web)使用PHP腳本,我發現有時curl_exec會終止執行腳本而不輸出任何錯誤。我希望我的腳本永久運行在一個循環中,並對此有何想法?curl_exec超時可以終止腳本?

+0

是的,它是用於後端任務。我需要它循環,只要我需要。我需要知道爲什麼curl_exec會終止腳本,以及如何避免這個 – 2010-05-14 14:07:17

+0

請顯示一些代碼。你知道PHP的max_execution_time設置嗎? – 2010-05-14 14:09:26

+0

此任務是否不斷運行(即過程開始並持續數小時),還是某種計劃任務? – 2010-05-16 05:19:48

回答

2

,您需要:

set_time_limit(0); 

否則,只要你的腳本運行了30秒(或任何max_execution_time在php.ini中指定),該腳本將退出並出現錯誤。這會中斷腳本可能正在做的任何事情,例如從curl_exec()獲得回報。

用PHP寫一個守護進程(這基本上是什麼好像你正在做的)can be found here關於慎用。

0

請確保您有錯誤報告集,把這個在你的PHP文件的頂部:

ini_set('display_errors', true); 
error_reporting(E_ALL); 

您也可以擴展腳本的執行時間:

ini_set('max_execution_time', 50000); 
1

這很容易被超時問題。

您可以設置捲曲超時(用於獲取網站),例如到60秒通過

curl_setopt($ch, CURLOPT_TIMEOUT, 60); 

然後,您需要設置PHP超時高於60秒,

set_time_limit(90); 

這個超時在Windows上是實時的,在Unix上是CPU時間,因此在Unix中你需要的時間要少得多。在你的循環中設置PHP超時非常重要,否則就是整體限制,永遠不會滿足你的無限循環。

do { 
    set_time_limit(90); 
    // curl stuff 
} while (true); 
+0

這可以避免中斷執行腳本嗎? – 2010-05-15 00:57:37

+0

是的,如果中斷的原因是PHP超時。如果你沒有設置超時而有(無意的)無限循環,那麼默認超時將遲早會中斷腳本。當然,我們不知道,在超時會阻止它之前,您的腳本是否因其他原因被中斷。 – Sam 2010-05-16 07:22:09

0

在你的PHP,你可以設置CURLOPT_VERBOSE變量追查問題:

 
curl_setopt($curl, CURLOPT_VERBOSE, TRUE); 

這則記錄到STDERR,或到指定的文件使用CURLOPT_STDERR:

 
curl_setopt($curl, CURLOPT_STDERR, './path/to/file.log'); 

從命令行,您可以使用以下開關:

* --verbose to report more info to the command line 
* --trace <file> or --trace-ascii <file> to trace to a file 

可以使用--trace時前面加上時間戳如果你想在進程能夠啓動和運行無限到長篇大論/文件輸出

+0

當您使用上述選項發生錯誤後,請將其發佈,以便我們可以幫助您解決它:) – Michael 2010-05-16 05:20:54