PHP 處理模型為「請求級單線程」,單進程同一時刻只能處理一個請求。面對高併發、IO 密集型任務(並發 HTTP 請求、批量數據庫操作、文件處理),傳統同步阻塞嚴重浪費 CPU 等待時間。本文系統梳理 PHP 並發解決方案:多進程、Swoole 協程、異步非阻塞 IO、消息隊列削峰。
$children = [];
$taskCount = 100;
$workerNum = 10;
$perWorker = ceil($taskCount / $workerNum);
for ($i = 0; $i < $workerNum; $i++) {
$pid = pcntl_fork();
if ($pid === -1) {
die('fork failed');
} elseif ($pid === 0) {
// 子進程
$start = $i * $perWorker;
$end = min($start + $perWorker, $taskCount);
for ($j = $start; $j < $end; $j++) {
doHeavyTask($j);
}
exit(0);
} else {
$children[] = $pid;
}
}
// 父進程等待所有子進程結束
while ($children) {
$pid = pcntl_wait($status);
$key = array_search($pid, $children);
if ($key !== false) unset($children[$key]);
}
echo "All done\n";
Swoole 4.x+ 提供協程調度器,單進程可承載萬級並發協程,自動將同步 IO(MySQL、Redis、HTTP、cURL、文件)轉為異步非阻塞。
Co\run(function () {
$chan = new Chan(100);
// 並發發起 100 個 HTTP 請求
for ($i = 0; $i < 100; $i++) {
go(function () use ($chan, $i) {
$client = new Swoole\Coroutine\Http\Client('api.example.com', 443, true);
$client->setHeaders(['User-Agent' => 'Swoole']);
$client->set(['timeout' => 5]);
$ret = $client->get("/item/$i");
$chan->push(['index' => $i, 'body' => $client->body, 'code' => $client->getStatusCode()]);
});
}
// 收集結果
$results = [];
for ($i = 0; $i < 100; $i++) {
$results[] = $chan->pop();
}
// 處理 $results
});
// ReactPHP 示例
$loop = React\EventLoop\Factory::create();
$browser = new Clue\React\Buzz\Browser($loop);
$promises = [];
for ($i = 0; $i < 50; $i++) {
$promises[] = $browser->get("https://api.example.com/item/$i")
->then(fn(Psr\Http\Message\ResponseInterface $res) => (string)$res->getBody());
}
\React\Promise\all($promises)->then(function (array $bodies) {
// 所有請求完成
var_dump($bodies);
});
$loop->run();
將任務推入 Kafka/RabbitMQ/Redis Stream,由多個 Worker 進程(PHP CLI + PCNTL/Swoole)消費。
優勢:
• 生產者響應極快(只入隊)
• 消費者可水平擴展、異語言混合
• 天然削峰填谷、重試、死信隊列、監控
將高併發、高性能核心邏輯剝離為 Go/Rust 服務,PHP 通過 gRPC/HTTP 調用。
適用:實時推送、高頻交易、流式計算、圖像/視頻處理。
| 場景 | 推薦方案 | 關鍵考量 |
|---|---|---|
| CLI 批量任務、數據遷移、報表生成 | PCNTL 多進程 / Swoole Task | 簡單、隔離、利用多核 |
| Web 服務高併發 API、WebSocket、實時推送 | Swoole/OpenSwoole + Hyperf/Webman | 協程化、生態豐富、生產驗證 |
| 共享主機/無擴展權限、輕量異步 | ReactPHP / Amp | 純 PHP、部署無門檻 |
| 異構系統解耦、流量削峰、任務重試 | 消息隊列 + Worker 池 | 架構級、可觀測、多語言 |
| 極致性能、CPU 密集、實時流處理 | Go/Rust 微服務側車 | 技術棧拆分、團隊能力 |
PHP 「無多線程」並非不可逾越的牆。從進程、協程、異步事件循環到架構級隊列、異語言微服務,工具箱豐富多樣。關鍵在於:識別業務瓶頸類型(IO/CPU)、評估團隊技術棧、選擇 ROI 最高的方案。新項目首選 Swoole 協程生態;存量項目漸進式引入隊列解耦;核心熱點外包給 Go/Rust。