首页
关于小站
朋友
时光之书
笔顺字帖
LayUI手册
元素周期表
Search
1
【PHP】PHPoffice/PHPSpreadsheet读取和写入Excel
2,317 阅读
2
【Layui】控制页面元素展示隐藏
2,152 阅读
3
【PHP】PHP实现JWT生成和验证
2,079 阅读
4
【Git】No tracked branch configured for branch master or the branch doesn't exist.
2,054 阅读
5
【composer】composer常用命令
1,850 阅读
默认分类
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手册
元素周期表
搜索到
2
篇与
的结果
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日
19 阅读
0 评论
0 点赞
2026-03-27
【swoole】OpenSwoole的应用
OpenSwoole 是 PHP 的异步、协程、高性能网络通信引擎,能让 PHP 做到:高性能 HTTP 服务(替代 Nginx+FPM,单机万级并发)异步任务(邮件、短信、推送不阻塞主流程)定时任务(替代 Linux Crontab)WebSocket 实时通信(聊天室、实时通知)TCP/UDP 服务、微服务、高并发爬虫环境准备(1 分钟安装)# 安装 openswoole 扩展 pecl install openswoole验证:<?php echo OpenSwoole\Util::getVersion();场景 1:搭建高性能 HTTP 服务(最常用)替代传统 Nginx+PHP-FPM,并发提升 10~100 倍,支持路由、静态文件、接口服务。完整可运行代码<?php use OpenSwoole\Http\Server; use OpenSwoole\Http\Request; use OpenSwoole\Http\Response; // 创建 HTTP 服务,监听 0.0.0.0:9501 $server = new Server('0.0.0.0', 9501); // 配置(worker 数 = CPU 核心数) $server->set([ 'worker_num' => 4, 'enable_static_handler' => true, 'document_root' => __DIR__ . '/public', // 静态文件目录 ]); // 处理请求 $server->on('Request', function (Request $request, Response $response) { // 获取请求参数 $path = $request->server['request_uri']; $get = $request->get; $post = $request->post; // 路由分发 if ($path === '/') { $response->header('Content-Type', 'text/html; charset=utf-8'); $response->end("<h1>OpenSwoole HTTP 服务运行中</h1>"); } // 接口示例:用户信息 elseif ($path === '/api/user') { $uid = $get['uid'] ?? 0; $response->header('Content-Type', 'application/json'); $response->end(json_encode([ 'code' => 0, 'msg' => 'success', 'data' => [ 'uid' => $uid, 'name' => 'OpenSwoole 用户', 'time' => date('Y-m-d H:i:s') ] ])); } else { $response->status(404); $response->end("404 Not Found"); } }); echo "服务启动:http://127.0.0.1:9501\n"; $server->start();运行 & 测试php http_server.php # 访问 # http://127.0.0.1:9501 # http://127.0.0.1:9501/api/user?uid=100你必须掌握的点Request 封装所有请求信息(GET/POST/HEADER/COOKIE)Response 只能调用一次 end(),响应结束服务常驻内存,比传统 PHP 快极多场景 2:异步任务(最核心业务价值)场景:注册发送邮件、下单发送短信、日志上报、数据统计——不阻塞用户请求。异步任务服务器代码<?php use OpenSwoole\Http\Server; use OpenSwoole\Http\Request; use OpenSwoole\Http\Response; $server = new Server('0.0.0.0', 9502); $server->set([ 'worker_num' => 2, 'task_worker_num' => 4, // 任务进程数 ]); // 处理 HTTP 请求 $server->on('Request', function (Request $request, Response $response) use ($server) { // 业务:用户注册 $data = [ 'email' => 'test@demo.com', 'content' => '欢迎注册' ]; // 投递异步任务(非阻塞,瞬间返回) $server->task($data); // 直接响应,不用等邮件发送完成 $response->end("注册成功,邮件已发送"); }); // 任务处理进程 $server->on('Task', function ($server, $taskId, $workerId, $data) { echo "开始发送邮件:{$data['email']}\n"; // 模拟耗时:2 秒(真实场景:发送邮件/短信/推送) sleep(2); echo "邮件发送完成\n"; // 任务完成 return 'success'; }); // 任务完成回调 $server->on('Finish', function ($server, $taskId, $result) { echo "任务 $taskId 完成,结果:$result\n"; }); $server->start();核心价值用户请求0 等待耗时任务丢给任务进程,不影响接口响应速度支撑高并发业务必备场景 3:WebSocket 实时通信(聊天室/实时通知)场景:在线客服、实时弹幕、订单状态实时推送、游戏。服务端代码<?php use OpenSwoole\WebSocket\Server; use OpenSwoole\WebSocket\Frame; use OpenSwoole\Http\Request; $server = new Server('0.0.0.0', 9503); // 客户端连接 $server->on('Open', function (Server $server, Request $request) { echo "客户端 {$request->fd} 连接\n"; }); // 接收消息并广播 $server->on('Message', function (Server $server, Frame $frame) { echo "收到消息:{$frame->data}\n"; // 广播给所有在线客户端(聊天室核心) foreach ($server->connections as $fd) { if ($server->isEstablished($fd)) { $server->push($fd, "广播:{$frame->data}"); } } }); // 客户端关闭 $server->on('Close', function (Server $server, $fd) { echo "客户端 {$fd} 断开\n"; }); $server->start();前端测试代码(HTML)<script> const ws = new WebSocket('ws://127.0.0.1:9503'); ws.onmessage = (e) => alert(e.data); // 发送消息 ws.send('Hello OpenSwoole'); </script>场景 4:定时任务(替代 Crontab,更灵活)场景:每分钟统计订单、每小时清理缓存、每天同步数据。<?php use OpenSwoole\Timer; // 每 1 秒执行 Timer::tick(1000, function () { echo "每秒执行:" . date('H:i:s') . "\n"; }); // 5 秒后执行一次 Timer::after(5000, function () { echo "5 秒后执行\n"; }); // 保持服务运行 Swoole\Event::wait();场景 5:协程 MySQL + Redis(高并发数据库操作)OpenSwoole 协程能让IO 操作(MySQL/Redis/Curl)并发执行,速度提升巨大。协程 MySQL 示例<?php use OpenSwoole\Coroutine\MySQL; use OpenSwoole\Coroutine; Coroutine::create(function () { $db = new MySQL(); $db->connect([ 'host' => '127.0.0.1', 'user' => 'root', 'password' => '123456', 'database' => 'test', ]); $res = $db->query('SELECT * FROM user LIMIT 1'); var_dump($res); });并发请求(3 个请求并行,只花 1 秒而不是 3 秒)<?php use OpenSwoole\Coroutine; Coroutine\run(function () { // 并行 3 个协程 Coroutine::create(function () { sleep(1); echo "任务1\n"; }); Coroutine::create(function () { sleep(1); echo "任务2\n"; }); Coroutine::create(function () { sleep(1); echo "任务3\n"; }); });场景 6:多进程处理(大量数据导出/批量任务)场景:百万数据导出、批量发送消息、数据清洗。<?php use OpenSwoole\Process; // 创建 4 个子进程 for ($i = 0; $i < 4; $i++) { $process = new Process(function () use ($i) { echo "子进程 $i 运行,PID:" . getmypid() . "\n"; sleep(2); echo "子进程 $i 结束\n"; }); $process->start(); } // 回收子进程 while ($ret = Process::wait()) { echo "子进程 {$ret['pid']} 退出\n"; }你必须掌握的 5 个核心特性(精通关键)1. 常驻内存传统 PHP:请求结束 → 销毁所有变量OpenSwoole:变量常驻内存,重复使用注意:不要用全局变量存用户会话,会串请求2. 协程(Coroutine)轻量级线程,开销极小IO 阻塞(MySQL/Redis/Curl)自动切换高并发核心技术3. 异步非阻塞任务、消息推送、文件IO都可以异步接口响应速度极快4. 多进程模型Master 管理进程Worker 处理请求Task 处理异步任务5. 热重启(生产必备)修改代码后不用重启服务:kill -USR1 主进程PID生产环境最佳实践(直接照做)配置 worker_num = CPU 核心数静态文件用 Nginx 代理,PHP 接口用 OpenSwoole数据库连接使用连接池定时任务统一管理使用 systemd 守护进程总结你现在已经掌握 OpenSwoole 最实用的 6 大业务场景,所有代码复制即可运行:HTTP 高性能接口服务异步任务(邮件/短信/推送)WebSocket 实时通信定时任务协程并发 MySQL/Redis多进程批量任务
2026年03月27日
22 阅读
0 评论
0 点赞