php利用curl multi 函式實現非同步請求

2021-07-05 14:25:43 字數 2941 閱讀 3575

這是php官方示例的用curl實現併發請求的**: 

<?php

// create both curl resources

$ch1 = curl_init();

$ch2 = curl_init();

curl_setopt($ch1, curlopt_url, "");

curl_setopt($ch1, curlopt_header, 0);

curl_setopt($ch2, curlopt_url, "");

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

$active = null;

//execute the handles

do while ($mrc == curlm_call_multi_perform);

while ($active && $mrc == curlm_ok) while ($mrc == curlm_call_multi_perform);

}}//close the handles

curl_multi_remove_handle($mh, $ch1);

curl_multi_remove_handle($mh, $ch2);

curl_multi_close($mh);

?>

改造一下,把請求數減少為1個,就得到用curl實現非同步請求的原始**:

<?php 

/** * test async of curl_multi

* @author: deno

*//**

* create and return curl resouce

*/function createcurlresouce($strurl)

error_reporting(-1);

// 記錄開始時間

$starttime = microtime(true);

// 建立請求控制代碼,請求的 src_sleep.php 可以sleep一段時間以突顯非同步效果

// 建立批處理curl控制代碼

$mh = curl_multi_init();

// 增加1個控制代碼

curl_multi_add_handle($mh, $ch1);

// 執行批處理控制代碼

$running=null;

curl_multi_exec($mh, $running);

// 等待一定時間(以模擬計算過程)

echo 'start sleep to demostrate time-consuming counting: ', date('h:i:s'), "

\n";

sleep(4);

// 阻塞等待到介面有返回

curl_multi_select($mh);

curl_multi_exec($mh, $running);

// 獲取介面資料

$rs = curl_multi_getcontent($ch1);

echo $rs;

// 關閉全部控制代碼

curl_multi_remove_handle($mh, $ch1);

curl_multi_close($mh);

echo 'end test: ', date('h:i:s'), ', time consume: ', (microtime(true)-$starttime), "

\n";

?>

為方便說明問題,進一步簡單地封裝上述**:

<?php 

/** * create and return curl resouce

*/function createcurlresouce($strurl)

/** * send request async and return handlers for reciever to input

*/function send_request($ch)

/** * receive request async and return result

*/function rev_request($mh, $ch)

// 記錄開始時間

$starttime = microtime(true);

// 建立請求控制代碼,目標檔案sleep一段時間以突顯非同步效果

// 傳送非同步請求

$mh = send_request($ch1);

// 等待一定時間(模擬計算過程)

sleep(4);

// 接受非同步請求

$rs = rev_request($mh, $ch1);

// 輸出結果

echo $rs;

echo 'end test: ', date('h:i:s'), ', time consume: ', (microtime(true)-$starttime), "

\n";

?>

這樣就簡單粗陋地實現了 send_request() 與 rev_request() 這種非同步請求的形式(實際生產環境的**肯定要優化)。

在我的另乙個帖子裡試圖說明,不單是邏輯形式上,其底層請求實現也是非同步的。

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

PHP使用curl multi併發請求

輪詢 do 一旦有乙個請求完成,找出來,處理,因為curl底層是select,所以最大受限於1024 while done curl multi info read 當沒有資料的時候進行堵塞,把 cpu 使用權交出來,避免上面 do 死迴圈空跑資料導致 cpu 100 if running if r...