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

PHP 並發程式設計五大方案深度解析:curl_multi、Swoole、Process、pthreads、Generator 協程

     編輯:PHP 相關知識

PHP 並發程式設計五大方案深度解析:curl_multi、Swoole、Process、pthreads、Generator 協程

PHP 傳統同步阻塞模型在高併發 IO 密集場景效能受限。本文系統整理五種實現並發的技術方案,涵蓋原生擴展、第三方框架與語言級協程,附完整代碼範例與適用場景分析。

1. curl_multi — 並發 HTTP 請求

原生擴展,事件驅動非阻塞多請求。核心 curl_multi_select() 等待任意連線活動(類似 select/epoll)。

$mh = curl_multi_init();
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
$running = null;
do {
    curl_multi_exec($mh, $running);
    if (curl_multi_select($mh) !== 0) {
        $info = curl_multi_info_read($mh);
        if ($info) { $response = curl_multi_getcontent($info['handle']); break; }
    }
} while ($running > 0);

適用: 並發呼叫多個外部 API、爬蟲、健康檢查。

2. Swoole Client 異步模式

Swoole 提供純 PHP 異步網絡通訊,SWOOLE_SOCK_ASYNC 回調模式。

$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
$client->on('connect', function($cli) { $cli->send($request); });
$client->on('receive', function($cli, $data) { echo $data; exit; });
$client->connect('127.0.0.1', 80);

適用: 高併發 TCP/UDP 客戶端、即時通訊、微服務呼叫。

3. Swoole Process 多進程

swoole_process 替代 pcntl_fork,內建管道通訊、事件循環。

$workers = [];
for ($i=0; $i<3; $i++) {
    $proc = new swoole_process('workerFunc');
    $pid = $proc->start();
    $workers[$pid] = $proc;
    swoole_event_add($proc->pipe, function($pipe) use($proc) { echo $proc->read(); });
}
function workerFunc(swoole_process $proc) { $proc->write('response'); }

適用: CPU 密集任務分發、守護進程管理、替代 pcntl 跨平台。

4. pthreads 多執行緒

需 PHP 編譯啟用 ZTS (Thread Safe)。Thread、Worker、Stackable 物件導向執行緒模型。

class Task extends Stackable { public $result; public function run() { $this->result = 'done'; } }
class WorkerThread extends Worker { public function run() { while(is_null($this->task->result)) sleep(1); } }
$task = new Task(); $w = new WorkerThread($task); $w->start(); echo $task->result;

注意: 僅限 CLI 模式,非 ZTS 環境無法使用,Windows 需下載對應 TS 版 DLL。

5. Generator 協程

PHP 5.5+ yield 實現協程調度,單執行緒實現高併發 IO 多工。配合 socket_select 事件循環。

function requestHandler($socket, $data) {
    list($resp) = (yield new AsyncTask($data, '127.0.0.1', 2345, 3000));
    socket_sendto($socket, $resp, ...);
}
$server = new AsyncServer('requestHandler');
$server->run();

優勢: 同步寫法實現異步邏輯,無回調地獄,記憶體佔用極低。

方案選型建議

方案類型適用場景學習曲線
curl_multiIO 多工並發 HTTP/API 呼叫低
Swoole Async/Process異步/多進程高併發服務端、微服務、即時通訊中
pthreads多執行緒CLI 密集運算、共享記憶體場景高
Generator 協程協程高併發 IO 服務端、自定義事件循環中高

現代 PHP 高併發首選 Swoole 或 Laravel Octane (Swoole/RoadRunner),Generator 適合輕量自研框架。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved