這是一個循環在我們的腳本中使用curl。這導致CPU使用率高達100%。一位朋友說:「你的計算機循環速度如此之快,以至於沒有時間來處理請求,因爲它總是在檢查結束。」......所以我的問題是如何重新編寫這個循環來減慢速度?謝謝while while循環造成100%的CPU使用率與curl_multi_exec
$running = null;
do {
curl_multi_exec($mh, $running);
} while($running > 0);
這是一個循環在我們的腳本中使用curl。這導致CPU使用率高達100%。一位朋友說:「你的計算機循環速度如此之快,以至於沒有時間來處理請求,因爲它總是在檢查結束。」......所以我的問題是如何重新編寫這個循環來減慢速度?謝謝while while循環造成100%的CPU使用率與curl_multi_exec
$running = null;
do {
curl_multi_exec($mh, $running);
} while($running > 0);
你可以加入睡眠一秒鐘的sleep(1)
到循環中。
在每次迭代中向http://php.net/sleep或http://php.net/usleep添加調用應允許通過允許操作系統調度其他正在運行的進程來減少CPU使用率。
使用此功能是至今在問題和所有其他答案中缺失的VITAL步驟。 –
看似沒有效果,但謝謝 –
不幸的是你沒有張貼整個代碼。我想你正在做類似
$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個項目。
嘗試:
$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);
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);
如果有人看到一個很好的方式來避免,而無需複製代碼,而(真),請指出來。
嘗試了上面提供的所有解決方案,但是這個在高負載系統中適用於我,每秒都有超過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);
}
您的意思是睡眠(1)'? – 2011-06-22 04:36:47