2011-08-02 44 views
2

下面的例子摘自:curl_multi_exec性能conern

http://php.net/manual/en/function.curl-multi-close.php#example-3540

這個例子將創建兩個捲曲把手,將它們添加到多手柄, 然後並行地運行它們。

<?php 
// create both cURL resources 
$ch1 = curl_init(); 
$ch2 = curl_init(); 

// set URL and other appropriate options 
curl_setopt($ch1, CURLOPT_URL, "http://www.example.com/"); 
curl_setopt($ch1, CURLOPT_HEADER, 0); 
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/"); 
curl_setopt($ch2, CURLOPT_HEADER, 0); 

//create the multiple cURL handle 
$mh = curl_multi_init(); 

//add the two handles 
curl_multi_add_handle($mh,$ch1); 
curl_multi_add_handle($mh,$ch2); 

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

//close the handles 
curl_multi_remove_handle($mh, $ch1); 
curl_multi_remove_handle($mh, $ch2); 
curl_multi_close($mh); 

?> 

我調整了一點,以實現我的需求。我只想調用一個資源,但在請求時執行本地代碼。這工作得很好,我的性能問題也適用於沒有修改的示例。

我產生了需要5秒以遞送資源,並用它們爲$ CH1和$ CH2

正如所預期的總執行只有5秒而不是10

了,但在做環我加一個小計數器顯示curl_multi_exec和do循環在〜5秒內在本地機器上執行〜5000000次。這大概是每微秒一次,這實際上相當多。

我很擔心,這佔用大量的CPU資源,而只是在等待請求完成,基本上無所作爲。

我記得的第一件事情我在一個Java課程中學之一是爲了避免無限循環,並與工作線程休眠/中斷,而不是針對上述原因。

但是我們沒有線程在這裏,我不知道這是否是有效的PHP了。

由於這是我認爲我而是請專家在這裏第一次正式的例子。

我想過DO循環實現短的睡眠。喜歡usleep(100)

  • 我關心的是否有效?

    • 如果是這樣,睡眠解決方案是一個很好的解決方案嗎?

      • 如果是這樣,什麼是一個良好的睡眠間隔?我會喜歡儘可能小的東西,所以沒有任何過程變慢,但我也不想錘擊服務器。
    • 如果不是,爲什麼?

+1

我個人不能說,但你可以測試添加微睡眠。如果它增加了時間,那麼對'curl_multi_exec'的永久調用是必要的。無論如何,100微秒對我來說看起來不錯,可能更多的是讓測試結果更加明顯。 – hakre

+0

如果您決定使用usleep(100),請注意如果您在Windows上運行Windows。見警告[這裏](http://www.php.net/manual/en/function.usleep.php#allnotes)。 – PPrice

回答

4

你的程序循環,像瘋了似的喜歡這樣,因爲curl_exec_multi()會一直執行,並嘗試做一些事情,你的程序沒有相應的等待你的東西再次調用之前採取行動。

請參閱curl_multi_select瞭解爲此目的明確制定的PHP函數並應解決您的問題。