curl_normal.php
use time:0.830 s<?php
$srart_time = microtime(true);
$charr=;
//建立多個curl資源
for($i=0; $i<10; $i++)
// print_r($result);
$end_time = microtime(true);
echo sprintf("use time:%.3f s", $end_time - $srart_time);
?>
curl_multi.php
use time:0.259 s<?php
$srart_time = microtime(true);
$charr=;
//建立多個curl資源
for($i=0; $i<10; $i++)
$mh = curl_multi_init(); //1 建立批處理curl控制代碼
foreach($charr as $k => $ch)
$active = null;
//待優化點:
//在$active > 0,執行curl_multi_exec($mh,$active)而整個批處理控制代碼沒有全部執行完畢時,系統會不停地執行curl_multi_exec()函式。
dowhile($active > 0); //4
foreach($charr as $k => $ch)
curl_multi_close($mh); //7 關閉全部控制代碼
// print_r($result);
$end_time = microtime(true);
echo sprintf("use time:%.3f s", $end_time - $srart_time);
?>
在上個示例裡當$active > 0
時,執行curl_multi_exec($mh,$active)
而整個批處理控制代碼沒有全部執行完畢時,系統會不停地執行curl_multi_exec()
函式。這樣可能會輕易導致cpu占用很高。
進行改動的方式是應用curl函式庫中的curl_multi_select()函式,其函式原型如下:
int curl_multi_select ( resource $mh [, float $timeout = 1.0 ] )
阻塞直到curl批處理連線中有活動連線。成功時返回描述符集合中描述符的數量。失敗時,select失敗時返回-1,否則返回超時(從底層的select系統呼叫)。
我用們curl_multi_select()函式來達到沒有需要讀取的程式就阻塞住的目的。
下面是優化部分的**:
curl_multi_select.php
這樣執行的好處是$active = null;
dowhile ($mrc == curlm_call_multi_perform); //4
//本次迴圈第一次處理$mh批處理中的$ch控制代碼,並將$mh批處理的執行狀態寫入$active ,當狀態值等於curlm_call_multi_perform時,表明資料還在寫入或讀取中,執行迴圈,當第一次$ch控制代碼的資料寫入或讀取成功後,狀態值變為curlm_ok,跳出本次迴圈,進入下面的大迴圈之中。
//$active 為true,即$mh批處理之中還有$ch控制代碼正待處理,$mrc==curlm_ok,即上一次$ch控制代碼的讀取或寫入已經執行完畢。
while ($active && $mrc == curlm_ok) while ($mrc == curlm_call_multi_perform);
}}
$mh
批處理中的$ch
控制代碼會在讀取或寫入資料結束後($mrc==curlm_ok
),進入curl_multi_select($mh)
的阻塞階段,而不會在整個$mh
批處理執行時不停地執行curl_multi_exec,白白浪費cpu資源。
執行結果:
use time:0.325 s
耗時並沒有多少改變,只是效能提高了。
上面的例子還存在優化的空間, 優化的方式時當某個url請求完畢之後盡可能快的去處理它, 邊處理邊等待其他的url返回, 而不是等待那個最慢的介面返回之後才開始處理等工作, 從而避免cpu的空閒和浪費。
僅貼出修改部分:
curl_multi_rolling.php
use time:0.267 s$active = null;
do // a request was just completed -- find out which one
while ($done = curl_multi_info_read($mh))
// block for data in / output; error handling is done by curl_multi_exec
if ($active > 0)
} while ($active);
1、php模擬傳送post請求之五curl基本使用和多執行緒優化
2、rolling curl: php併發最佳實踐
3、curl_multi_select解決curl_multi網頁假死問題
php利用curl multi 函式實現非同步請求
這是php官方示例的用curl實現併發請求的 create both curl resources ch1 curl init ch2 curl init curl setopt ch1,curlopt url,curl setopt ch1,curlopt header,0 curl setopt...
PHP利用CURL MULTI實現多執行緒
php中的curl multi一類函式可以實現同時請求多個url,而不是乙個乙個依次請求,這就類似乙個程序實現了多個執行緒的功能,因此可以使用php利用curl multi實現完成多執行緒類的任務,下面就乙個利用php curl multi多執行緒採集網頁為例來說明一下。檢視 列印01 02 功能 ...
PHP利用CURL MULTI實現多執行緒爆破
第二天我通過各種網路搜尋又搞出了乙個更快的方法,使用curl multi這個東西我在網路上也沒看懂到底是怎麼回事,但是網上的文章都千篇一律,全是copy的,我也就依葫蘆畫瓢,拼拼湊湊勉強能夠執行,先貼出 function fn function writelog str if post nums a...