一、核心区别(一句话总览)
- Fiber(PHP 8.1+ 原生纤程):语言底层原语、无事件循环、无内置IO、纯用户态调度,只提供暂停/恢复能力,需自己实现事件循环与非阻塞IO,适合轻量并发、库开发、兼容现有框架。
- Swoole(扩展协程):成熟全栈异步框架、内置事件循环+协程调度+全量非阻塞IO客户端/服务器、自动Hook原生函数,生态完善、性能极强,适合高并发Web/API、长连接、微服务、网关。
- Swow(新一代扩展协程):极简设计、纯协程无回调、内置事件循环、兼容原生语法、性能接近Swoole、更轻量易维护,适合现代高性能应用、替代Swoole、追求简洁。
二、详细对比表
| 维度 | Fiber(原生) | Swoole | Swow |
|---|---|---|---|
| 依赖 | PHP 8.1+,无需扩展 | 需安装swoole扩展 | 需安装swow扩展 |
| 本质 | 纤程(用户态线程),仅提供 suspend/resume | 协程+完整异步网络引擎 | 纯协程+极简事件驱动 |
| 事件循环 | 无内置,需自己实现 | 内置epoll/kqueue,自动调度 | 内置,极简实现 |
| IO支持 | 无内置非阻塞IO,需配合第三方库 | 内置协程MySQL/Redis/HTTP/TCP/WebSocket | 内置协程客户端,兼容原生 |
| 自动Hook | 不支持 | 支持(Runtime::enableCoroutine) | 支持,更轻量 |
| 适用场景 | 轻量并发、库开发、兼容FPM/传统框架 | 高并发Web、长连接、网关、微服务、游戏 | 高性能Web、微服务、替代Swoole、简洁优先 |
| 学习成本 | 低(原生语法) | 中高(框架+扩展) | 中(接近原生,无回调) |
| 性能 | 调度极快,但IO需自己处理 | 极高,成熟优化 | 极高,接近Swoole |
三、应用场景+可直接运行的实战示例
1. Fiber(原生纤程):轻量并发、兼容现有项目
核心场景:批量HTTP请求、数据库批量查询、轻量任务并行,不改造现有FPM/框架即可用。
核心API:new Fiber()、start()、suspend()、resume()、getReturn()
<?php
// PHP 8.1+ 原生Fiber,无需扩展
function fetchUrl(string $url): string
{
// 模拟非阻塞请求(实际需配合非阻塞IO库如ReactPHP/Amphp)
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
$res = curl_exec($ch);
curl_close($ch);
return $res;
}
// 并发请求多个接口
$urls = [
'https://httpbin.org/delay/1',
'https://httpbin.org/delay/2',
'https://httpbin.org/delay/1.5',
];
$fibers = [];
// 创建Fiber并启动
foreach ($urls as $url) {
$fiber = new Fiber(function () use ($url) {
// 挂起,交出控制权,等待恢复
return Fiber::suspend(fetchUrl($url));
});
$fiber->start(); // 启动到suspend处
$fibers[] = $fiber;
}
// 恢复所有Fiber,等待完成
$results = [];
foreach ($fibers as $fiber) {
$fiber->resume(); // 恢复执行
$results[] = $fiber->getReturn();
}
var_dump($results);
// 总耗时≈2秒(最长请求),而非1+2+1.5=4.5秒2. Swoole:高并发Web/API、长连接、微服务
核心场景:HTTP服务器、WebSocket、TCP服务、批量数据库/Redis、API网关、IM系统。
核心API:Co\run()、go()、Co::sleep()、WaitGroup、协程客户端
<?php
// 需安装swoole扩展,CLI运行
use Swoole\Coroutine\WaitGroup;
use function Swoole\Coroutine\run;
use function Swoole\Coroutine\go;
run(function () {
$wg = new WaitGroup();
$results = [];
// 并发HTTP请求
$wg->add();
go(function () use ($wg, &$results) {
$cli = new Swoole\Coroutine\Http\Client('httpbin.org', 80);
$cli->get('/delay/2');
$results['http'] = $cli->getStatusCode();
$cli->close();
$wg->done();
});
// 并发MySQL查询
$wg->add();
go(function () use ($wg, &$results) {
$mysql = new Swoole\Coroutine\MySQL();
$mysql->connect([
'host' => '127.0.0.1',
'user' => 'root',
'password' => '',
'database' => 'test',
]);
$res = $mysql->query('SELECT SLEEP(1)');
$results['mysql'] = $res;
$wg->done();
});
// 等待所有协程完成
$wg->wait();
var_dump($results);
// 总耗时≈2秒,而非2+1=3秒
});Swoole HTTP服务器(极简):
<?php
$server = new Swoole\Http\Server('0.0.0.0', 9501);
$server->on('Request', function ($request, $response) {
// 协程内同步写代码,自动非阻塞
$mysql = new Swoole\Coroutine\MySQL();
$mysql->connect(['host'=>'127.0.0.1','user'=>'root','password'=>'','database'=>'test']);
$data = $mysql->query('SELECT * FROM user LIMIT 1');
$response->end(json_encode($data));
});
$server->start();3. Swow:极简高性能协程,替代Swoole
核心场景:现代高性能Web、微服务、API、轻量长连接,无回调、纯协程、语法接近原生。
核心API:Swow\Coroutine、run()、yield、协程客户端
<?php
// 需安装swow扩展,CLI运行
use Swow\Coroutine;
use Swow\Coroutine\WaitGroup;
use Swow\Http\Client;
Coroutine::run(function () {
$wg = new WaitGroup();
$results = [];
// 并发HTTP
$wg->add();
Coroutine::create(function () use ($wg, &$results) {
$cli = new Client('httpbin.org', 80);
$cli->get('/delay/2');
$results['http'] = $cli->getStatusCode();
$wg->done();
});
// 并发Redis
$wg->add();
Coroutine::create(function () use ($wg, &$results) {
$redis = new Swow\Redis('127.0.0.1', 6379);
$redis->set('key', 'swow');
$results['redis'] = $redis->get('key');
$wg->done();
});
$wg->wait();
var_dump($results);
});四、快速掌握实战要点(直接上手)
✅ Fiber快速上手
- 版本:PHP ≥8.1,默认开启,无需扩展
- 核心:
Fiber::suspend()暂停、resume()恢复;无内置事件循环,IO需自己处理(配合ReactPHP/Amphp) - 最佳实践:用于轻量并行、库封装、兼容FPM,不适合高并发长连接
✅ Swoole快速上手
- 安装:
pecl install swoole,PHP ≥7.4 - 核心:必须在
Co\run()或Swoole Server内使用协程;go()创建协程;Runtime::enableCoroutine()自动Hook PDO/Redis/CURL等原生函数,同步写法、异步执行 - 最佳实践:高并发Web、WebSocket、微服务、网关,生态最完善
✅ Swow快速上手
- 安装:
pecl install swow,PHP ≥8.0 - 核心:纯协程、无回调、内置事件循环;语法接近原生,学习成本低于Swoole
- 最佳实践:新项目、追求简洁、替代Swoole,性能接近Swoole
五、选型建议(直接选)
- 轻量、兼容现有FPM/框架、不想装扩展 → Fiber
- 成熟高并发、长连接、微服务、生态完善 → Swoole
- 新项目、极简、纯协程、不想用复杂框架 → Swow
下面全部是真实业务开发里最常用、能直接复制改改就上线的场景,不讲原理,只讲干什么 + 怎么写 + 为什么用协程。语言偏实战、粗暴、直接可用。
一、先给你一个总结论(业务视角)
- Fiber(原生纤程)
适合:FPM 环境下批量接口并发、报表统计、导出优化,不能做长连接、服务器。 - Swoole
适合:API 服务、WebSocket 聊天/推送、定时任务、高并发爬虫、IM、网关,生态最成熟。 - Swow
适合:新一代高性能 API、微服务、替代 Swoole,更干净、更少坑。
下面每个场景都给业务用途 + 可直接运行代码。
二、Fiber 真实业务场景(PHP 8.1+ FPM 也能用)
场景 1:后台导出 Excel / 统计报表(最常用)
业务痛点:
一次性查 10 个统计接口/10 张表,串行要 3~5 秒,用户体验差。
用 Fiber 并发,总耗时 ≈ 最慢那一个。
<?php
// 纯原生,无需扩展
function statUser() {
sleep(1); // 模拟查用户统计
return ["user_count" => 1000];
}
function statOrder() {
sleep(1); // 模拟订单统计
return ["order_amount" => 9999];
}
function statLog() {
sleep(1); // 模拟日志统计
return ["log_count" => 5678];
}
// 并发执行
$f1 = new Fiber(fn() => statUser());
$f2 = new Fiber(fn() => statOrder());
$f3 = new Fiber(fn() => statLog());
$f1->start();
$f2->start();
$f3->start();
$result = [
'user' => $f1->getReturn(),
'order' => $f2->getReturn(),
'log' => $f3->getReturn(),
];
var_dump($result); // 总耗时 1s,不是 3s场景 2:批量调用第三方接口(短信、物流、支付查询)
function request($url) {
usleep(500000); // 模拟 0.5s 接口耗时
return file_get_contents($url);
}
$urls = [
"https://api.kuaidi100.com?id=1",
"https://api.kuaidi100.com?id=2",
"https://api.kuaidi100.com?id=3",
];
$fibers = [];
foreach ($urls as $u) {
$f = new Fiber(fn() => request($u));
$f->start();
$fibers[] = $f;
}
$data = [];
foreach ($fibers as $f) $data[] = $f->getReturn();Fiber 业务总结
- 优点:FPM 能用、不用装扩展、语法简单
- 缺点:没有非阻塞 IO、不能做服务器、不能长连接
- 业务定位:后台统计、导出、批量接口并发提速
三、Swoole 真实业务场景(90% PHP 高并发都用它)
场景 1:API 接口服务(替代 FPM,TPS 提升 5~20 倍)
<?php
$server = new Swoole\Http\Server("0.0.0.0", 9501);
$server->on("Request", function ($req, $resp) {
// 协程 MySQL
$db = new Swoole\Coroutine\MySQL();
$db->connect([
'host' => '127.0.0.1',
'user' => 'root',
'password' => '123456',
'database' => 'shop',
]);
$user = $db->query("SELECT * FROM user WHERE id=1");
// 协程 Redis
$redis = new Swoole\Coroutine\Redis();
$redis->connect('127.0.0.1', 6379);
$token = $redis->get('user_token_1');
$resp->end(json_encode([
'user' => $user,
'token' => $token
]));
});
$server->start();场景 2:WebSocket 实时聊天 / 后台消息推送
业务:商城客服、IM、订单状态实时推送、后台告警
$server = new Swoole\WebSocket\Server("0.0.0.0", 9502);
$server->on('Open', function ($ser, $req) {
echo "客户端{$req->fd}连接\n";
});
$server->on('Message', function ($ser, $frame) {
// 广播给所有人
foreach ($ser->connections as $fd) {
$ser->push($fd, "你说:{$frame->data}");
}
});
$server->start();场景 3:并发处理 1000 条订单 / 批量发短信
use Swoole\Coroutine\WaitGroup;
Co\run(function () {
$wg = new WaitGroup();
$mobiles = ['13800138000', '13800138001', ... 1000个];
foreach (array_chunk($mobiles, 50) as $chunk) {
$wg->add();
go(function () use ($chunk, $wg) {
foreach ($chunk as $m) {
// 调用短信接口
file_get_contents("http://sms/?m=$m");
}
$wg->done();
});
}
$wg->wait();
echo "全部发送完成";
});场景 4:定时任务 + 异步队列(秒杀、订单超时取消)
// 每秒执行
Swoole\Timer::tick(1000, function () {
// 取消超时未支付订单
Co::create(function () {
$db = new Swoole\Coroutine\MySQL();
$db->connect(...);
$db->query("UPDATE order SET status=0 WHERE status=1 AND create_time < NOW()-300");
});
});Swoole 业务总结
- 最适合:API、微服务、WebSocket、IM、高并发爬虫、订单系统
- 最大优势:生态全、坑少、公司招聘认
- 业务地位:PHP 高并发事实上的标准
四、Swow 真实业务场景(现代简洁版 Swoole)
场景 1:高性能 HTTP API 接口
<?php
use Swow\Http\Server;
$server = new Server();
$server->bind('0.0.0.0', 9503);
$server->handle('/', function ($request, $response) {
// 协程 MySQL
$db = new Swow\Db\MySQL('mysql://root:123456@127.0.0.1/shop');
$user = $db->query('SELECT * FROM user WHERE id=1');
$response->json($user);
});
$server->start();场景 2:批量并发请求(爬虫 / 第三方接口)
use Swow\Coroutine as Co;
Co::run(function () {
$cos = [];
foreach (range(1, 10) as $i) {
$cos[] = Co::create(function () use ($i) {
usleep(500000);
echo "任务{$i}完成\n";
});
}
foreach ($cos as $co) $co->join();
});Swow 业务总结
- 优点:纯协程、无回调、干净、性能强
- 缺点:生态不如 Swoole
- 适合:新项目、追求简洁、不想踩 Swoole 老坑
五、三者在业务里的区别(最简版)
| 场景 | Fiber | Swoole | Swow |
|---|---|---|---|
| FPM 环境 | ✅ 能用 | ❌ 不能 | ❌ 不能 |
| HTTP 服务器 | ❌ 不能 | ✅ 强 | ✅ 强 |
| WebSocket | ❌ 不能 | ✅ 强 | ✅ 强 |
| 定时任务 | ❌ 不能 | ✅ 强 | ✅ 强 |
| 协程 MySQL/Redis | ❌ 需自己写 | ✅ 内置 | ✅ 内置 |
| 公司招聘认可度 | 低 | 极高 | 中高 |
| 上手难度 | 最简单 | 中等 | 简单 |
六、你该怎么快速掌握(直接照做)
- 日常后台统计、导出、接口并发
直接用 Fiber,复制我给的代码就能跑。 - 做高并发 API、微服务、WebSocket、商城、IM
直接学 Swoole,公司 99% 要这个。 - 新项目、追求简洁、不想折腾
用 Swow。
评论 (0)