首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP cURL 多執行緒併發請求原理與高效能實作詳解

     編輯:PHP 綜合知識

核心函數族

  • curl_multi_init、curl_multi_add_handle、curl_multi_exec
  • curl_multi_getcontent、curl_multi_info_read、curl_multi_select
  • curl_multi_remove_handle、curl_multi_close

標準流程

  1. curl_multi_init 建立批次處理控制代碼
  2. 循環 curl_init 建立子 handle,curl_setopt 設定 URL/選項,curl_multi_add_handle 加入批次
  3. 持續呼叫 curl_multi_exec 執行
  4. 根據需要循環 curl_multi_getcontent 取得結果
  5. curl_multi_remove_handle 移除子 handle,curl_close 關閉
  6. curl_multi_close 關閉批次控制代碼

官方範例的 CPU 100% 問題

do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($mh) != -1) {
        do {
            $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}

原始 do-while 為忙等待,導致 CPU 滿載。

改進版:引入 curl_multi_select 休眠喚醒

do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($mh) != -1) {
        do {
            $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}

curl_multi_select 會阻塞直到有資料可讀或逾時,大幅降低 CPU 佔用。

關鍵細節

  • 超時控制: curl_setopt($ch, CURLOPT_TIMEOUT, $timeout) 在 add_handle 前設定
  • 錯誤檢測: curl_error($ch) 在 getcontent 前檢查
  • 併發上限: 實測約 500-512,超過會導致失敗

高效能封裝類別特性

  • 固定併發數穩定運行,回調函數動態加入任務不影響併發
  • CPU 佔用極低,多數消耗在使用者回調
  • 支援鏈式任務(單一任務需多來源採集)
  • CURL 錯誤自動重試(次數可配置)
  • 回調靈活:下載、抓取、404 分析可同進程並行
  • 可選擇啟用快取

已知限制

  • 單進程無法充分利用多核 CPU(可多進程解決)
  • 最大併發受 CURL 內部限制(~500)
  • 無斷點續傳、無單檔多執行緒分段下載
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved