2011-06-21 105 views
10

這是一個循環在我們的腳本中使用curl。這導致CPU使用率高達100%。一位朋友說:「你的計算機循環速度如此之快,以至於沒有時間來處理請求,因爲它總是在檢查結束。」......所以我的問題是如何重新編寫這個循環來減慢速度?謝謝while while循環造成100%的CPU使用率與curl_multi_exec

$running = null; 
do { 
    curl_multi_exec($mh, $running); 
} while($running > 0); 

回答

0

你可以加入睡眠一秒鐘的sleep(1)到循環中。

+0

您的意思是睡眠(1)'? – 2011-06-22 04:36:47

2

在每次迭代中向http://php.net/sleephttp://php.net/usleep添加調用應允許通過允許操作系統調度其他正在運行的進程來減少CPU使用率。

+0

sleep()對CPU使用率沒有影響,還有其他想法嗎? – Anagio

+0

如果1或2的值沒有任何區別,那麼你應該調查http://php.net/manual/en/function.curl-multi-exec.php。也許你必須關閉一些手柄或類似的東西。 – webspy

+0

睡眠問題在於即使進程完成,它也會阻塞。如果curl在調用curl_multi_exec後0.1秒完成,則必須等待0.9或1.9秒。 –

2

不幸的是你沒有張貼整個代碼。我想你正在做類似

$mh = curl_multi_init(); 
for ($i = 0; $i < $desiredThreadsNumber; $i++) { 
    $ch = curl_init(); 
    // set up $ch here 
    curl_multi_add_handle($mh, $ch); 
} 

你應該明白你還沒有在這裏運行線程。 curl_multi_exec()運行所有線程。但它不能同時運行所有$ desiredThreadsNumber線程。如果你看看curl_multi_exec() php.net頁面上的例子,你會看到你必須等待curl_multi_exec()運行所有線程。換句話說,你需要在下一個循環嵌套在這裏:

$running = null; 
do { 
    do { 
     $mrc = curl_multi_exec($mh, $running); 
    } while ($mrc == CURLM_CALL_MULTI_PERFORM); 
} while($running > 0); 

在年底讓我建議你閱讀這篇文章http://www.onlineaspect.com/2009/01/26/how-to-use-curl_multi-without-blocking/並使用代碼片段從那裏,我用它在2個或3個項目。

0

嘗試:

$running = null; 
    do { 
     do { 
      $mrc = curl_multi_exec($mh, $running); 
     } while ($mrc == CURLM_CALL_MULTI_PERFORM && curl_multi_select($mh) === 0); 
    } while($running > 0 && $mrc == CURLM_OK); 
1

curl_multi_select(http://php.net/manual/function.curl-multi-select.php)確實是要走的路,但有幾個注意事項。

首先,如果curl_multi_exec返回CURLM_CALL_MULTI_PERFORM,它有更多的數據要立即處理,所以應該再次運行。此外,重要的是檢查curl_multi_exec是否不會立即失敗;在這種情況下,curl_multi_select可能永遠阻塞。

這應該工作:

do { 
    while (CURLM_CALL_MULTI_PERFORM === curl_multi_exec($mh, $running)) {}; 
    if (!$running) break; 
    while (curl_multi_select($mh) === 0) {}; 
} while (true); 

如果有人看到一個很好的方式來避免,而無需複製代碼,而(真),請指出來。

1

嘗試了上面提供的所有解決方案,但是這個在高負載系統中適用於我,每秒都有超過1k的多Curl請求。

//Execute Handles 
$running = null; 

do { 
    $mrc = curl_multi_exec($mh, $running); 
} while($mrc == CURLM_CALL_MULTI_PERFORM); 

while ($running && $mrc == CURLM_OK) { 
    if (curl_multi_select($mh) == -1) { 
     usleep(1); 
    } 
    do { 
     $mrc = curl_multi_exec($mh, $running); 
    } while ($mrc == CURLM_CALL_MULTI_PERFORM); 
}