首页
关于小站
朋友
时光之书
笔顺字帖
LayUI手册
元素周期表
Search
1
【PHP】PHPoffice/PHPSpreadsheet读取和写入Excel
2,287 阅读
2
【Layui】控制页面元素展示隐藏
2,095 阅读
3
【Git】No tracked branch configured for branch master or the branch doesn't exist.
2,017 阅读
4
【PHP】PHP实现JWT生成和验证
2,005 阅读
5
【composer】composer常用命令
1,812 阅读
默认分类
PHP
ThinkPHP
Laravel
面向对象
设计模式
算法
基础
网络安全
webman
swoole
Web
HTML
CSS
JavaScript
jQuery
Layui
VUE
uni-app
Database
MySQL
Redis
RabbitMQ
Nginx
Git
Linux
Soft Ware
Windows
网赚
Go
Docker
Elasticsearch
登录
Search
标签搜索
PHP
函数
方法
类
MySQL
ThinkPHP
JavaScript
OOP
Layui
Web
Server
Nginx
Docker
PHPSpreadsheet
PHPoffice
Array
设计模式
Git
排序算法
基础
小破孩
累计撰写
268
篇文章
累计收到
13
条评论
首页
栏目
默认分类
PHP
ThinkPHP
Laravel
面向对象
设计模式
算法
基础
网络安全
webman
swoole
Web
HTML
CSS
JavaScript
jQuery
Layui
VUE
uni-app
Database
MySQL
Redis
RabbitMQ
Nginx
Git
Linux
Soft Ware
Windows
网赚
Go
Docker
Elasticsearch
页面
关于小站
朋友
时光之书
笔顺字帖
LayUI手册
元素周期表
搜索到
1
篇与
的结果
2026-04-10
【PHP】PHP协程Fiber、Swoole、Swow区别与应用场景
一、核心区别(一句话总览)Fiber(PHP 8.1+ 原生纤程):语言底层原语、无事件循环、无内置IO、纯用户态调度,只提供暂停/恢复能力,需自己实现事件循环与非阻塞IO,适合轻量并发、库开发、兼容现有框架。Swoole(扩展协程):成熟全栈异步框架、内置事件循环+协程调度+全量非阻塞IO客户端/服务器、自动Hook原生函数,生态完善、性能极强,适合高并发Web/API、长连接、微服务、网关。Swow(新一代扩展协程):极简设计、纯协程无回调、内置事件循环、兼容原生语法、性能接近Swoole、更轻量易维护,适合现代高性能应用、替代Swoole、追求简洁。二、详细对比表维度Fiber(原生)SwooleSwow依赖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 老坑五、三者在业务里的区别(最简版)场景FiberSwooleSwowFPM 环境✅ 能用❌ 不能❌ 不能HTTP 服务器❌ 不能✅ 强✅ 强WebSocket❌ 不能✅ 强✅ 强定时任务❌ 不能✅ 强✅ 强协程 MySQL/Redis❌ 需自己写✅ 内置✅ 内置公司招聘认可度低极高中高上手难度最简单中等简单六、你该怎么快速掌握(直接照做)日常后台统计、导出、接口并发直接用 Fiber,复制我给的代码就能跑。做高并发 API、微服务、WebSocket、商城、IM直接学 Swoole,公司 99% 要这个。新项目、追求简洁、不想折腾用 Swow。
2026年04月10日
6 阅读
0 评论
0 点赞