PHP 之 curl multi實現併發

2022-02-26 01:15:48 字數 2742 閱讀 4312

curl_normal.php

<?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);

?>

use time:0.830 s

curl_multi.php

<?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);

?>

use time:0.259 s

在上個示例裡當$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

$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);

use time:0.267 s

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...