协程在Laravel中需依赖Swoole或Octane等常驻进程环境才能生效,FPM下直接使用会报错;它并非Laravel原生能力,而是由Swoole调度,且仅对协程化IO操作(如Swoole\Coroutine\MySQL)提升并发性能,Eloquent等同步代码仍阻塞。

协程在 Laravel 里不能直接“开启就生效”,它依赖运行环境是否支持协程调度——Laravel 本身是同步框架,FPM 下连 go() 都会报 Fatal error: Uncaught Swoole\Error: must be called in the coroutine。只有切换到 Swoole 或 Octane 这类常驻进程模型,协程才有落地可能。
协程不是 Laravel 功能,而是 Swoole 的能力
很多人误以为装个包就能让 Laravel “自动协程化”。事实是:Laravel 不知道协程,Swoole 才管协程调度。你在 php artisan serve 或 Apache/FPM 下写 go(function () { ... }),必然失败。
- 必须用
Swoole\Http\Server、Swoole\Coroutine\run()或laravel/octane启动协程上下文 -
Octane底层就是 Swoole(或 FrankenPHP),它把每次请求包裹进协程,但 Laravel 内部代码仍是同步写法 - 真正发挥协程并发优势的,是你自己写的异步逻辑:比如并发调多个 HTTP 接口、批量查 Redis、并行发消息
- 别指望 Eloquent 查询自动变协程——
DB::table()->get()还是阻塞的,除非你换成Swoole\Coroutine\MySQL
在 Laravel 中安全使用协程的三个前提
跳过这三步,协程代码要么不执行,要么引发连接泄漏、数据错乱或内存暴涨。
- 运行环境必须是
swoole(非 FPM):确认php -m | grep swoole有输出,且Octane已通过php artisan octane:start启动 - IO 操作必须用协程化客户端:不能继续用
curl_exec()、PDO、Redis::get();得换Swoole\Coroutine\Http\Client、Swoole\Coroutine\MySQL、Swoole\Coroutine\Redis - 共享变量要显式传参:协程间不共享作用域,
foreach里用go(function () use ($item, &$results) { ... }),漏掉&$results就收不到结果
常见错误:在队列任务里滥用 go() 导致连接爆满
有人在 handle() 方法里写 go() 发起 100 个协程查 Redis,结果每个协程都新建一个 Swoole\Coroutine\Redis 实例,Redis 连接数瞬间冲到上千——这不是协程优化,是连接风暴。
-
Swoole\Coroutine\Redis默认不池化连接,每个new都建新 TCP 连接 - 正确做法是复用单个连接实例:
$redis = new Swoole\Coroutine\Redis(); $redis->connect(...);,然后在所有go()里use ($redis) - 更稳妥的是用
predis/predis+swooletw/laravel-swoole的连接池工厂,或直接上twemproxy做连接代理 - 队列任务默认不在协程环境里运行(除非你手动 wrap),
php artisan queue:work仍是 FPM 模式,go()直接报错
协程性能提升只发生在 IO 等待环节
协程不会让 CPU 计算变快,它只是把“等 Redis 回复”“等 MySQL 返回”“等 HTTP 响应”的空闲时间腾出来跑别的任务。如果你的请求全是密集计算(比如图像处理、加密解密),协程几乎没收益,甚至因调度开销略慢。
- 实测显示:纯数据库 I/O 场景下,
TrueAsync协程方案吞吐比Octane+Swoole高约 64%,因为前者对 PG 的协程封装更彻底 - 但只要混入一次
sleep(1)或未协程化的file_get_contents(),整个协程调度器就会被卡住,其他并发任务全停摆 - 协程内不能调用任何非协程安全函数:比如
exec()、shell_exec()、扩展未 hook 的 C 层阻塞调用
最容易被忽略的一点:协程生命周期和 Laravel 请求生命周期不绑定。一个协程可能在响应已返回后还在跑(比如发通知、写日志),此时 app() 容器、request() 对象、数据库连接都可能已被释放。别在 defer() 或协程末尾读取 Auth::user() ——它大概率是 null。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











