摘要:普通請求創建多個資源并發創建多個資源創建批處理句柄增加句柄待優化點在執行而整個批處理句柄沒有全部執行完畢時,系統會不停地執行函數。進行改動的方式是應用函數庫中的函數,其函數原型如下阻塞直到批處理連接中有活動連接。
普通請求
curl_normal.php
use time:0.830 s
curl_multi并發curl_multi.php
$ch){ curl_multi_add_handle($mh, $ch); //2 增加句柄 } $active = null; //待優化點: //在$active > 0,執行curl_multi_exec($mh,$active)而整個批處理句柄沒有全部執行完畢時,系統會不停地執行curl_multi_exec()函數。 do{ echo "running "; curl_multi_exec($mh, $active); //3 執行批處理句柄 }while($active > 0); //4 foreach($chArr as $k => $ch){ $result[$k]= curl_multi_getcontent($ch); //5 獲取句柄的返回值 curl_multi_remove_handle($mh, $ch);//6 將$mh中的句柄移除 } 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
curl_multi并發優化:curl_multi_select在上個示例里當$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; do{ echo "running "; $mrc = curl_multi_exec($mh, $active); //3 執行批處理句柄 }while ($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) { if (curl_multi_select($mh) != -1) {//$mh批處理中還有可執行的$ch句柄,curl_multi_select($mh) != -1程序退出阻塞狀態。 do { $mrc = curl_multi_exec($mh, $active);//繼續執行需要處理的$ch句柄。 } 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
耗時并沒有多少改變,只是性能提高了。
curl_multi并發優化:rolling上面的例子還存在優化的空間, 優化的方式時當某個URL請求完畢之后盡可能快的去處理它, 邊處理邊等待其他的URL返回, 而不是等待那個最慢的接口返回之后才開始處理等工作, 從而避免CPU的空閑和浪費。
僅貼出修改部分:
curl_multi_rolling.php
$active = null; do { while (($mrc = curl_multi_exec($mh, $active)) == CURLM_CALL_MULTI_PERFORM) ; if ($mrc != CURLM_OK) { break; } // a request was just completed -- find out which one while ($done = curl_multi_info_read($mh)) { // get the info and content returned on the request $info = curl_getinfo($done["handle"]); $error = curl_error($done["handle"]); $result[] = curl_multi_getcontent($done["handle"]); // $responses[$map[(string) $done["handle"]]] = compact("info", "error", "results"); // remove the curl handle that just completed curl_multi_remove_handle($mh, $done["handle"]); curl_close($done["handle"]); } // Block for data in / output; error handling is done by curl_multi_exec if ($active > 0) { curl_multi_select($mh); } } while ($active);
use time:0.267 s
參考1、PHP模擬發送POST請求之五curl基本使用和多線程優化
http://www.cnblogs.com/zhenbi...
2、Rolling cURL: PHP并發最佳實踐
https://www.oschina.net/quest...
3、curl_multi_select解決curl_multi網頁假死問題
http://www.webkaka.com/tutori...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/28656.html
摘要:根據獲取請求對象這個比較簡單可以看官方文檔將三個待請求對象放入下載器中輪詢一旦有一個請求完成,找出來,處理因為底層是,所以最大受限于從請求中獲取信息內容錯誤把請求已經完成了得刪除當沒有數據的時候進行堵塞,把使用權交出來,避免上面死循環空跑數 class CurlMultiUtil { /** * 根據url,postData獲取curl請求對象,這個比較簡單,可以看官方...
摘要:不支持多線程模式和回調處理,因此內部腳本都是同步阻塞式的,如果你發起一個的請求,那么程序就會阻塞,直到請求返回結果,才會繼續執行代碼。參考資料手冊手冊預定義常量中實現多線程請求詳解每次使用同時并發多少請求合適簡書多線程及原理 后端服務開發中經常會有并發請求的需求,比如你需要獲取10家供應商的帶寬數據(每個都提供不同的url),然后返回一個整合后的數據,你會怎么做呢? 在PHP中,最直觀...
摘要:今天我就來聊聊我關于函數集的使用心得,關于請求的問題。耗時這是不能容忍的。事實上內部實現就是用的事件循環。通過函數創建下載器。四復雜的運用這就是用法在上面的例子中。動態的從下載器中取出已經完成了的請求。函數實現的壓測工具。 一、引言 這段時間比較忙,已經很久沒有寫博客了。今天我就來聊聊我關于curl_multi_*函數集的使用心得,關于http請求的問題。 當我們用戶php發起一個ht...
摘要:最近在維護一個三年前的舊代碼,用的是框架。單元測試和語言并發控制實際上是個蛋疼的問題,夸張一點說,當時的并不能特別輕松地實現并發,甚至不能實現并發。語言的功能之一就是自帶單元測試。用語言之前,我的習慣是不寫單元測試。 最近在維護一個三年前的舊代碼,用的是laravel框架。 從某些方面來講,這個代碼算是比較標準為了實現在規定的時間內完成相關功能,同時程序員水平不高、經過大量優化之后,變...
閱讀 2581·2021-11-22 12:01
閱讀 1105·2021-11-15 11:37
閱讀 3685·2021-09-22 14:59
閱讀 1746·2021-09-04 16:45
閱讀 1382·2021-09-03 10:30
閱讀 1013·2021-08-11 11:18
閱讀 2459·2019-08-30 10:53
閱讀 2013·2019-08-29 15:13