在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 網頁設計教程 > 詳細頁面

php如何完成并發請求(代碼)

php如何完成并發請求(代碼)

更新時間:2025-12-05 文章作者:未知 信息來源:網絡 閱讀次數:

網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立...
網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立在超文本基礎之上的。超級文本標記語言之所以稱為超文本標記語言,是因為文本中包含了所謂“超級鏈接”點。
本篇文章給大家帶來的內容是關于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_contentsfsockopen請求方式,PHP也支持cURL擴展來發起請求,它支持常規的單個請求:PHP cURL請求詳解,也支持并發請求,其并發原理是cURL擴展使用多線程來管理多請求。

PHP并發請求

我們直接來看代碼demo:

// 簡單demo,默認支持為GET請求
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;
}

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

curl_multi 相關函數

/** 函數作用:返回一個新cURL批處理句柄
    @return resource 成功返回cURL批處理句柄,失敗返回false
*/
resource curl_multi_init ( void )

/** 函數作用:向curl批處理會話中添加單獨的curl句柄
    @param $mh 由curl_multi_init返回的批處理句柄
    @param $ch 由curl_init返回的cURL句柄
    @return resource 成功返回cURL批處理句柄,失敗返回false
*/
int 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 void
*/
void 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) 0

PHP并發請求耗時對比

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

  2. 第二次請求使用傳統的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在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 国产资源在线免费观看| aa在线观看视频| 最近免费中文字幕中文高清百度| 99热这里只有精品7| 久国产精品视频| www亚洲成人| 免费一区二区三区在线观看| 可以免费在线看黄的网站| 欧美日韩黄色一级片| 九一国产精品视频| 男人添女人下面高潮视频| 成年人看的毛片| 国产精品-区区久久久狼 | 丰满少妇久久久| 欧美成人精品免费| 欧美三级午夜理伦三级| 亚洲一区在线不卡| 91亚洲免费视频| 艳母动漫在线免费观看| 无码人妻精品一区二区蜜桃网站| 国产一级做a爰片久久毛片男| 丁香六月激情婷婷| 久久精品99国产| 亚洲午夜精品一区| 无码人妻精品一区二区三区99v| 50度灰在线观看| 欧美久久久久久久久久久久久| 成年人视频观看| 日本高清一区二区视频| 97中文字幕在线| 男人的天堂日韩| 国产在线无码精品| 可以在线看的黄色网址| www.色.com| 国产免费毛卡片| 超碰免费在线公开| 男女av免费观看| 成人性做爰片免费视频| 99蜜桃臀久久久欧美精品网站| www.久久久精品| 国产九色porny| 欧美性受xxxxxx黑人xyx性爽| 国产美女主播在线| 中文字幕22页| 国产成人精品视频免费看| 91性高潮久久久久久久| 国产性xxxx18免费观看视频| 人人妻人人澡人人爽精品欧美一区| 男人天堂手机在线视频| 男女污污视频网站| 日韩欧美黄色大片| 成人中文字幕在线播放| 日韩不卡视频一区二区| 中文字幕第38页| 日韩视频在线免费看| 国产欧美日韩小视频| 特级黄色录像片| 91福利免费观看| 日本激情视频在线播放| 久久人妻精品白浆国产| 被灌满精子的波多野结衣| 欧美激情亚洲天堂| 亚洲天堂av一区二区三区| 中文字幕在线观看第三页| 免费欧美一级视频| 日本少妇高潮喷水视频| 800av在线免费观看| 97久久国产亚洲精品超碰热 | 久久视频这里有精品| 黄色污污在线观看| 神马午夜伦理影院| 男人添女人下部视频免费| 国产免费xxx| 日本香蕉视频在线观看| 热久久最新地址| 青青青青草视频| 亚洲熟妇av一区二区三区漫画| 男人操女人逼免费视频| 精品久久久久av| 天堂一区在线观看| www.色就是色.com| 日韩视频一二三| 国内精品在线观看视频| 久久网站免费视频| 在线观看免费的av| 久久久成人精品一区二区三区 | 欧美色图另类小说| 北条麻妃av高潮尖叫在线观看| 在线免费视频一区| 99精品视频免费版的特色功能| 99热这里只有精品7| 浮妇高潮喷白浆视频| 欧美韩国日本在线| 三日本三级少妇三级99| 免费cad大片在线观看| 黄色一级视频片| 国产精品区在线| 国产一区二区三区乱码| 午夜精品久久久内射近拍高清| 91精品无人成人www| 99久re热视频精品98| 男女午夜激情视频| 中文字幕制服丝袜在线| 激情综合网婷婷| 欧美美女黄色网| 中文字幕在线综合| 男人添女人下面高潮视频| 亚洲色图偷拍视频| 少妇av一区二区三区无码| 特级西西444www| 日本男人操女人| 欧美二区在线视频| 日韩久久久久久久久久久久| 午夜免费高清视频| 国产成人久久婷婷精品流白浆| 亚洲小说欧美另类激情| 182午夜在线观看| aa免费在线观看| 很污的网站在线观看| 中文字幕av导航| 午夜免费一级片| 国内国产精品天干天干| 黄色三级视频片| 欧美精品一区二区三区免费播放| 日韩a级黄色片| 久久天天东北熟女毛茸茸| 精品亚洲视频在线| 成人综合久久网| 中文字幕亚洲欧洲| 中文字幕av不卡在线| 国产性生交xxxxx免费| www.爱色av.com| 日日摸天天爽天天爽视频| 少妇人妻在线视频| 精品中文字幕av| 国产wwwxx| 91亚洲免费视频| www.成人黄色| 国产九九热视频| 岳毛多又紧做起爽| 国产无限制自拍| 国产福利精品一区二区三区| 91日韩精品视频| 午夜激情视频网| 日韩不卡的av| 蜜桃免费在线视频| а 天堂 在线| 亚洲精品在线网址| 中文字幕在线视频精品| 日本a√在线观看| 天天综合中文字幕| 99中文字幕在线观看| av中文字幕av| 日韩一二区视频| 欧洲熟妇精品视频| 欧美大尺度做爰床戏| 亚洲欧洲日本精品| 五月婷婷丁香综合网| 黄色免费高清视频| 伊人久久在线观看| 国产精品50p| 日本久久久精品视频| 国产一级免费大片| 国产在线无码精品| 亚洲午夜无码av毛片久久| 亚洲一级片av| 久久这里只有精品8| 凹凸国产熟女精品视频| 中文字幕在线导航| 精品无码一区二区三区在线| 国产特级黄色大片| 高潮一区二区三区| 黄色特一级视频| 亚洲美女性囗交| 久久99久久久久久| 色综合天天色综合| 天天看片天天操| www.亚洲天堂网| 日韩不卡一二区| 国产精品333| 日韩人妻无码精品久久久不卡| 成年人免费在线播放| 天天影视色综合| 久久久亚洲精品无码| 黑人巨大国产9丨视频| 国内外成人免费激情视频| www.色就是色.com| 欧美日韩性生活片| 和岳每晚弄的高潮嗷嗷叫视频| 成人性视频欧美一区二区三区| 9l视频自拍9l视频自拍| 337p亚洲精品色噜噜狠狠p| 91香蕉视频在线观看视频| 国产白丝袜美女久久久久| 男插女免费视频| 国产主播在线看| 日本福利视频在线观看| www.超碰97.com| 国产主播中文字幕| 久久精品影视大全|