【PHP】PHP协程Fiber、Swoole、Swow区别与应用场景

小破孩
2026-04-10 / 0 评论 / 6 阅读 / 正在检测是否收录...

一、核心区别(一句话总览)

  • 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/框架即可用
核心APInew 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系统。
核心APICo\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、轻量长连接,无回调、纯协程、语法接近原生
核心APISwow\Coroutinerun()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快速上手

  1. 版本:PHP ≥8.1,默认开启,无需扩展
  2. 核心:Fiber::suspend() 暂停、resume() 恢复;无内置事件循环,IO需自己处理(配合ReactPHP/Amphp)
  3. 最佳实践:用于轻量并行、库封装、兼容FPM,不适合高并发长连接

✅ Swoole快速上手

  1. 安装:pecl install swoole,PHP ≥7.4
  2. 核心:必须在Co\run()或Swoole Server内使用协程;go()创建协程;Runtime::enableCoroutine()自动Hook PDO/Redis/CURL等原生函数,同步写法、异步执行
  3. 最佳实践:高并发Web、WebSocket、微服务、网关,生态最完善

✅ Swow快速上手

  1. 安装:pecl install swow,PHP ≥8.0
  2. 核心:纯协程、无回调、内置事件循环;语法接近原生,学习成本低于Swoole
  3. 最佳实践:新项目、追求简洁、替代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 老坑

五、三者在业务里的区别(最简版)

场景FiberSwooleSwow
FPM 环境✅ 能用❌ 不能❌ 不能
HTTP 服务器❌ 不能✅ 强✅ 强
WebSocket❌ 不能✅ 强✅ 强
定时任务❌ 不能✅ 强✅ 强
协程 MySQL/Redis❌ 需自己写✅ 内置✅ 内置
公司招聘认可度极高中高
上手难度最简单中等简单

六、你该怎么快速掌握(直接照做)

  1. 日常后台统计、导出、接口并发
    直接用 Fiber,复制我给的代码就能跑。
  2. 做高并发 API、微服务、WebSocket、商城、IM
    直接学 Swoole,公司 99% 要这个。
  3. 新项目、追求简洁、不想折腾
    Swow

0

评论 (0)

取消