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

PHP 實現類多線程的三種方案:curl_multi、Stream Socket、多進程

     編輯:PHP 相關知識

方案一:curl_multi 並發請求

利用 cURL 多執行緒一次發送多個 HTTP 請求,適用於需並行呼叫外部 API 的場景。缺點:走網路通訊,效率與可靠性受限於網路環境。

function sendMulitRequest($send_data) {
    $handle = curl_multi_init();
    foreach ($send_data as $k => $v) {
        $curl[$k] = curl_init();
        curl_setopt($curl[$k], CURLOPT_URL, $v['url']);
        curl_setopt($curl[$k], CURLOPT_POST, true);
        curl_setopt($curl[$k], CURLOPT_RETURNTRANSFER, 1);
        curl_multi_add_handle($handle, $curl[$k]);
    }
    $active = null;
    do { $mrc = curl_multi_exec($handle, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    while ($active && $mrc == CURLM_OK) {
        if (curl_multi_select($handle) != -1) {
            do { $mrc = curl_multi_exec($handle, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM);
        }
    }
    // 收集結果...
    return $text;
}

方案二:stream_socket_client 非阻塞 I/O

使用 stream_socket_client 配合 STREAM_CLIENT_ASYNC_CONNECT 與 stream_select 實現非阻塞並發 Socket 通訊,適合高效能長連線場景。

$s = stream_socket_client($host . ":80", $errno, $errstr, $timeout, STREAM_CLIENT_ASYNC_CONNECT | STREAM_CLIENT_CONNECT);
if ($s) { $sockets[$id++] = $s; fwrite($s, $http_message); }
// stream_select 監聽可讀寫...

方案三:pcntl_fork 多進程模擬多線程

利用 pcntl_fork 建立子進程,父進程管理進程池,子進程執行任務。需注意訊號處理(SIGCHLD)避免殭屍進程。

function daemon($func_name, $args, $number) {
    while (true) {
        $pid = pcntl_fork();
        if ($pid == -1) exit();
        elseif ($pid) { // 父進程
            static $num = 0;
            if (++$num >= $number) { pcntl_wait($status); $num--; }
        } else { // 子進程
            while (true) { call_user_func_array($func_name, $args); sleep(2); }
            exit();
        }
    }
}

選型建議

  • 簡單 HTTP 並發 → curl_multi
  • 自定義協議/長連線 → stream_socket
  • CPU 密集型/需隔離記憶體 → pcntl_fork
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved