PHP 傳統同步阻塞模型在高併發 IO 密集場景效能受限。本文系統整理五種實現並發的技術方案,涵蓋原生擴展、第三方框架與語言級協程,附完整代碼範例與適用場景分析。
原生擴展,事件驅動非阻塞多請求。核心 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、爬蟲、健康檢查。
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 客戶端、即時通訊、微服務呼叫。
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 跨平台。
需 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。
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_multi | IO 多工 | 並發 HTTP/API 呼叫 | 低 |
| Swoole Async/Process | 異步/多進程 | 高併發服務端、微服務、即時通訊 | 中 |
| pthreads | 多執行緒 | CLI 密集運算、共享記憶體場景 | 高 |
| Generator 協程 | 協程 | 高併發 IO 服務端、自定義事件循環 | 中高 |
現代 PHP 高併發首選 Swoole 或 Laravel Octane (Swoole/RoadRunner),Generator 適合輕量自研框架。