引子:在Android4.0開發中,發送Http請求已經不允許在主進程中執行了,必須線上程中執行。原因在於Http介面回應時間有可能阻塞主進程事件監聽(對於.Net開發,其實也是如此)。但是,由於PHP並沒有多線程的概念,那麼,如何高效率在PHP中執行多次http請求呢?答案是使用curl_multi_init,由此,我做了一個實驗。
以下是類比請求的http介面,代碼很簡單,通過get傳入的參數time,控制了sleep的時間。
$s_time=intval($_GET['time']);sleep($s_time);echo 'hello';
接下來僅僅使用curl_init,代碼如下:
$start=microtime(true);for($i=1;$i<=5;++$i){$ch=curl_init("http://test.binbin.com/curl/test.php?time={$i}");curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_exec($ch);}$end=microtime(true);echo $end-$start;
執行的時間約為15秒,是所有sleep時間總和,現在,來看看使用了curl_multi_init的時間
$start=microtime(true);$ch_list=array();$multi_ch=curl_multi_init();for($i=1;$i<=5;++$i){$ch_list[$i]=curl_init("http://test.binbin.com/curl/test.php?time={$i}");curl_setopt($ch_list[$i], CURLOPT_RETURNTRANSFER, true);curl_multi_add_handle($multi_ch, $ch_list[$i]);}$running=false;do { usleep(10000);curl_multi_exec($multi_ch, $running);}while ($running>0);$end=microtime(true);echo $end-$start;結果是僅僅需要5秒鐘,即使最長http請求的執行時間。
後記:看到不少的人在blog上反應使用curl_multi_init的CPU過高的問題,其實,是可以添加usleep解決的。因為,如果資料沒有返回curl_multi_exec會一直執行,消耗CPU資源。
以上就介紹了php curl批量發送http請求,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。