亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

php如何實現并發請求(代碼)

2020-03-22 18:44:33
字體:
來源:轉載
供稿:網友
本篇文章給大家帶來的內容是關于php如何實現并發請求(代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

后端服務開發中經常會有并發請求的需求,比如你需要獲取10家供應商的帶寬數據(每個都提供不同的url),然后返回一個整合后的數據,你會怎么做呢?

在PHP中,最直觀的做法foreach遍歷urls,并保存每個請求的結果即可,那么如果供應商提供的接口平均耗時5s,你的這個接口請求耗時就達到了50s,這對于追求速度和性能的網站來說是不可接受的。

這個時候你就需要并發請求了。

PHP請求

PHP是單進程同步模型,一個請求對應一個進程,I/O是同步阻塞的。通過nginx/apache/php-fpm等服務的擴展,才使得PHP提供高并發的服務,原理就是維護一個進程池,每個請求服務時單獨起一個新的進程,每個進程獨立存在。

PHP不支持多線程模式和回調處理,因此PHP內部腳本都是同步阻塞式的,如果你發起一個5s的請求,那么程序就會I/O阻塞5s,直到請求返回結果,才會繼續執行代碼。因此做爬蟲之類的高并發請求需求很吃力。

那怎么來解決并發請求的問題呢?除了內置的file_get_contents和fsockopen請求方式,PHP也支持cURL擴展來發起請求,它支持常規的單個請求:PHP cURL請求詳解,也支持并發請求,其并發原理是cURL擴展使用多線程來管理多請求。

PHP并發請求

我們直接來看代碼demo:

// 簡單demo,默認支持為GET請求html' target='_blank'>public function multiRequest($urls) { $mh = curl_multi_init(); $urlHandlers = []; $urlData = []; // 初始化多個請求句柄為一個 foreach($urls as $value) { $ch = curl_init(); $url = $value[ url  $url .= strpos($url, ? ) ? : ?  $params = $value[ params  $url .= is_array($params) ? http_build_query($params) : $params; curl_setopt($ch, CURLOPT_URL, $url); // 設置數據通過字符串返回,而不是直接輸出 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $urlHandlers[] = $ch; curl_multi_add_handle($mh, $ch); $active = null; // 檢測操作的初始狀態是否OK,CURLM_CALL_MULTI_PERFORM為常量值-1 do { // 返回的$active是活躍連接的數量,$mrc是返回值,正常為0,異常為-1 $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); // 如果還有活動的請求,同時操作狀態OK,CURLM_OK為常量值0 while ($active $mrc == CURLM_OK) { // 持續查詢狀態并不利于處理任務,每50ms檢查一次,此時釋放CPU,降低機器負載 usleep(50000); // 如果批處理句柄OK,重復檢查操作狀態直至OK。select返回值異常時為-1,正常為1(因為只有1個批處理句柄) if (curl_multi_select($mh) != -1) { do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); // 獲取返回結果 foreach($urlHandlers as $index = $ch) { $urlData[$index] = curl_multi_getcontent($ch); // 移除單個curl句柄 curl_multi_remove_handle($mh, $ch); curl_multi_close($mh); return $urlData;}

在該并發請求中,先創建一個批處理句柄,然后將url的cURL句柄添加到批處理句柄中,并不斷查詢批處理句柄的執行狀態,當執行完成后,獲取返回的結果。

curl_multi 相關函數
/** 函數作用:返回一個新cURL批處理句柄 @return resource 成功返回cURL批處理句柄,失敗返回falseresource curl_multi_init ( void )/** 函數作用:向curl批處理會話中添加單獨的curl句柄 @param $mh 由curl_multi_init返回的批處理句柄 @param $ch 由curl_init返回的cURL句柄 @return resource 成功返回cURL批處理句柄,失敗返回falseint curl_multi_add_handle ( resource $mh , resource $ch )/** 函數作用:運行當前 cURL 句柄的子連接 @param $mh 由curl_multi_init返回的批處理句柄 @param $still_running 一個用來判斷操作是否仍在執行的標識的引用 @return 一個定義于 cURL 預定義常量中的 cURL 代碼int curl_multi_exec ( resource $mh , int $still_running )/** 函數作用:等待所有cURL批處理中的活動連接 @param $mh 由curl_multi_init返回的批處理句柄 @param $timeout 以秒為單位,等待響應的時間 @return 成功時返回描述符集合中描述符的數量。失敗時,select失敗時返回-1,否則返回超時(從底層的select系統調用).int curl_multi_select ( resource $mh [, float $timeout = 1.0 ] )/** 函數作用:移除cURL批處理句柄資源中的某個句柄資源 說明:從給定的批處理句柄mh中移除ch句柄。當ch句柄被移除以后,仍然可以合法地用curl_exec()執行這個句柄。如果要移除的句柄正在被使用,則這個句柄涉及的所有傳輸任務會被中止。 @param $mh 由curl_multi_init返回的批處理句柄 @param $ch 由curl_init返回的cURL句柄 @return 成功時返回0,失敗時返回CURLM_XXX中的一個int curl_multi_remove_handle ( resource $mh , resource $ch )/** 函數作用:關閉一組cURL句柄 @param $mh 由curl_multi_init返回的批處理句柄 @return voidvoid curl_multi_close ( resource $mh )/** 函數作用:如果設置了CURLOPT_RETURNTRANSFER,則返回獲取的輸出的文本流 @param $ch 由curl_init返回的cURL句柄 @return string 如果設置了CURLOPT_RETURNTRANSFER,則返回獲取的輸出的文本流。string curl_multi_getcontent ( resource $ch )
本例中使用到的預定義常量:
CURLM_CALL_MULTI_PERFORM: (int) -1
CURLM_OK: (int) 0PHP并發請求耗時對比

第一次請求使用上面的curl_multi_init方法,并發請求105次。

第二次請求使用傳統的foreach方法,遍歷105次使用curl_init方法請求。

實際的請求耗時結果為:

433410620-5b965e6a51814_articlex.png

刨除download的約765ms耗時,單純的請求耗時優化達到了39.83/1.58達到了25倍,如果繼續刨除建連相關的耗時,應該會更高。這其中的耗時:

方案1:最慢的一個接口達到了1.58s

方案2:105個接口的平均耗時是384ms

這個測試的請求是我的環境的內部接口,所以耗時很短,實際爬蟲請求環境優化會更明顯。注意項并發數限制

curl_multi會消耗很多的系統資源,在并發請求時并發數有一定閾值,一般為512,是由于CURL內部限制,超過最大并發會導致失敗。

具體的測試結果我沒有做,可以參考別人的文章:每次使用curl multi同時并發多少請求合適超時時間

為了防止慢請求影響整個服務,可以設置CURLOPT_TIMEOUT來控制超時時間,防止部分假死的請求無限阻塞進程處理,最后打死機器服務。

CPU負載打滿

在代碼示例中,如果持續查詢并發的執行狀態,會導致cpu的負載過高,所以,需要在代碼里加上usleep(50000);的語句。
同時,curl_multi_select也可以控制cpu占用,在數據有回應前會一直處于等待狀態,新數據一來就會被喚醒并繼續執行,減少了CPU的無謂消耗。

相關推薦:

AJAX的隊列請求如何實現(附代碼)

PHP使用curl_multi實現并發請求的方法示例php技巧

以上就是php如何實現并發請求(代碼)的詳細內容,PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久综合久久美利坚合众国| 亚洲欧美成人精品| 久久91精品国产91久久跳| 九色精品免费永久在线| 久久久天堂国产精品女人| 在线免费观看羞羞视频一区二区| 欧美另类极品videosbestfree| 亚洲日本成人女熟在线观看| 丝袜亚洲另类欧美重口| 国产精品免费小视频| 欧洲一区二区视频| 国产精品第一视频| 91色p视频在线| 夜夜嗨av色综合久久久综合网| 久久久久久久999| 日韩精品视频在线观看免费| 国产欧美一区二区三区在线看| 午夜精品美女自拍福到在线| 91久久久久久| 国产精品久久久| 亚洲视频专区在线| 久久久精品视频在线观看| 久久久伊人欧美| 97激碰免费视频| 97碰碰碰免费色视频| 91久久精品国产| 热re91久久精品国99热蜜臀| 国产成人97精品免费看片| 日韩av手机在线观看| 精品国产一区久久久| 久久精品99无色码中文字幕| 成人免费在线视频网站| 亚洲欧美精品一区| 亚洲色图13p| 日韩av网址在线| 久久男人av资源网站| 亚洲大胆人体在线| 日韩专区在线观看| 中文字幕成人精品久久不卡| 亚洲精品电影在线| 综合av色偷偷网| 久青草国产97香蕉在线视频| 日韩在线视频免费观看| 亚洲精品理论电影| 日本精品久久中文字幕佐佐木| 日韩在线观看高清| 久久免费视频在线| 成人疯狂猛交xxx| 久久天天躁日日躁| 在线色欧美三级视频| 亚洲美女精品久久| 精品亚洲一区二区三区四区五区| 夜色77av精品影院| 日韩中文字幕第一页| 久久精品国产视频| 操人视频在线观看欧美| 91精品国产91久久久久久吃药| 亚洲肉体裸体xxxx137| 亚洲毛片在线观看| 欧美丰满少妇xxxx| 日本欧美在线视频| 一夜七次郎国产精品亚洲| 国产免费亚洲高清| 国产成人精品电影久久久| 久久久久久久电影一区| 国产日韩欧美电影在线观看| www.亚洲一区| 国产成人精品亚洲精品| 久久视频精品在线| 456国产精品| 精品亚洲永久免费精品| 98精品在线视频| 中文字幕亚洲色图| 久久视频免费在线播放| 日日噜噜噜夜夜爽亚洲精品| 亚洲精品99久久久久中文字幕| 国内伊人久久久久久网站视频| **欧美日韩vr在线| 91精品国产色综合| 91日本在线视频| 在线观看日韩视频| 在线国产精品播放| 欧美国产精品人人做人人爱| 岛国av一区二区在线在线观看| 欧美精品免费在线| 成人网在线观看| 精品久久久香蕉免费精品视频| 中文字幕亚洲一区二区三区| 爱福利视频一区| 欧美黑人巨大xxx极品| 中文字幕日韩av综合精品| 成人黄色免费在线观看| 国产一区二区三区18| 午夜精品久久久久久久白皮肤| 久久男人的天堂| 国模视频一区二区三区| 另类专区欧美制服同性| 精品欧美aⅴ在线网站| 亚洲精品美女在线观看| 亚洲色图50p| 亚洲一二三在线| 欧美日韩亚洲网| 国产综合视频在线观看| 日本成熟性欧美| 日韩电影免费观看中文字幕| 亚洲黄色免费三级| 日韩欧美极品在线观看| 欧美精品18videosex性欧美| 欧美激情精品久久久久久| 色噜噜亚洲精品中文字幕| 国产精品电影观看| 久久久999精品视频| 伊人精品在线观看| 亚洲欧美精品在线| 欧美黑人性猛交| 日韩av中文字幕在线| 久久久国产视频91| 一区二区三区在线播放欧美| 免费不卡欧美自拍视频| 亚洲аv电影天堂网| 欧美一级淫片丝袜脚交| 色妞色视频一区二区三区四区| 亚洲精品www久久久| 亚洲图片欧美日产| 欧美裸体视频网站| 欧美刺激性大交免费视频| 精品久久久一区| 欧美激情手机在线视频| 久久久久久午夜| 一区二区福利视频| 欧美三级免费观看| 亚洲一区二区三区久久| 色av吧综合网| 国产精品久久久久高潮| 久久影视三级福利片| 欧美亚洲国产成人精品| 成人女保姆的销魂服务| 亚洲人成欧美中文字幕| 欧美性一区二区三区| 久久亚洲精品中文字幕冲田杏梨| 69av视频在线播放| 日本免费久久高清视频| 日本成人在线视频网址| 国产精品爽黄69天堂a| 久久999免费视频| 精品久久久久久久久久久久久久| 在线不卡国产精品| 精品久久久久久久中文字幕| 欧美一级淫片播放口| 欧美午夜www高清视频| 日韩电视剧在线观看免费网站| 裸体女人亚洲精品一区| 一区三区二区视频| 国产精品扒开腿做爽爽爽视频| 78m国产成人精品视频| 中文字幕欧美日韩va免费视频| 欧美性猛交xxxx免费看漫画| 国产日韩在线一区| 4k岛国日韩精品**专区| 亚洲国产欧美日韩精品| 欧美理论在线观看| 欧美大片免费观看在线观看网站推荐| 亚洲第一网站男人都懂| 91成人精品网站|