2011-12-04 51 views
7

我得到了可怕的消息:curl_exec最大執行時間 - 是什麼造成的?

Fatal error: Maximum execution time of 90 seconds exceeded in /home/pricing.php on line 239 

的代碼是:(!對於一個更好的詞想)

$url = "http://*******.com/feed?f=PR&categories=$cat_id&limit=100&startproducts=$ii&price_min=0.01&sortproducts=score&show=properties"; 

$c = curl_init($url); 
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($c, CURLOPT_HEADER, 0); 
curl_setopt($c, CURLOPT_USERPWD, "****:****"); 
$xml = simplexml_load_string(curl_exec($c)); // line 239 

的simplexml_load_string是線239,當然這意味着供給是否得到和該字符串正在加載,但肯定不會超過90秒?

我的問題是:

1 - 什麼可能會導致這種情況?

2 - 可以安全地將php_value max_execution_time增加到90秒以上,並認爲是安全的最大值?

3 - 是否有更好/更快/更穩定的方式來降低飼料比使用捲曲?

感謝您的幫助!

+0

不,這並不意味着流「已得到」。如果網站的速度很慢,那麼可以在'curl_exec'中花費時間。如果你想確定,把它分成兩行。 – Mat

+0

啊好的 - 所以如果我把它分解如下: $ feed = curl_exec($ c); $ xml = simplexml_load_string($ feed); 這是你的意思嗎? –

+0

是的,那麼你就會知道兩個電話中的哪一個正在失速。 – Mat

回答

5

A1: 是的,你從第二個問題中得到了答案。這是由php的max_execution_time造成的。

A2: 這是不安全的,除非你在本地託管它,你知道你的腳本正在做什麼。我認爲常見的做法是30秒或最大300秒(5分鐘)。

A3 如果你正在處理的捲曲,我更喜歡你設置set_time_limit(0)你的PHP腳本(代碼級別等同於php.inimax_execution_time)的最頂端,並使用超時捲曲處理超時。

curl_setopt($curl, CURLOPT_TIMEOUT_MS, 2000); //in miliseconds 
+0

RE A3 - 這是否意味着腳本不會失敗,如果我設置CURLOPT_TIMEOUT_MS - 如果是的話,這是一個更好的選擇 –

+0

如果你是指**失敗** PHP執行超時,那麼答案是肯定的,只要set_time_limit非常高或0(無限),它就不會失敗。我不記得它碰到'CURLOPT_TIMEOUT_MS'時的確切細節,但有一點可以肯定的是'curl_exec($ c)'會返回空字符串。所以,在解析你的'simplexml_load_string'之前做一個簡單的檢查。 –

2
  1. 的捲曲外部飼料極爲緩慢

  2. 是確定增加的max_execution_time爲較高的值,但不推薦。如果腳本要作爲您的常規網頁之一,則必須考慮三次。沒有用戶希望等待超過90秒才能加載頁面。

  3. 緩存它!

緩存的細節它! : -

不是超級邏輯,
它的意思是,你可以準備飼料的URL列表,
然後做一個後臺作業(的cronjob)抓住每個提要URL和存儲到本地存儲。
一旦本地XML可用,從本地加載

因此,按需訪問是相反的,在任何用戶訪問頁面之前獲取XML。
困難將是很多不同的feed URL抓取,有一個curl_multi_exec這應該是理想的同時抓取多個url。