thinkphp6本身不内置swoole服务,必须通过think-swoole扩展或手写swoole\http\server实现;关键配置在于php扩展启用(extension=swoole.so且版本≥4.5.0)、think-swoole中显式开启协程(enable_coroutine=true、hook_flags=swoole_hook_all)及app实例复用,任一环节缺失均导致服务异常或协程失效。

直接上结论:ThinkPHP6 本身不内置 Swoole 服务,必须通过 think-swoole 官方扩展或手写 Swoole\Http\Server 实现;配置关键不在框架内,而在 PHP 扩展、启动方式和协程兼容性三处,漏掉任一环节都会导致服务起不来或协程失效。
php.ini 中 extension=swoole 必须生效且版本 ≥4.5.0
很多人在宝塔面板点“安装 Swoole”后就以为完事了,但实际 php -m | grep swoole 可能仍无输出。原因常见于:
- 宝塔默认 PHP 是多版本共存,你装的 Swoole 可能只启用了某个 PHP 版本(比如 8.1),而 CLI 或 Web 运行的是 7.4
- 扩展名写错:
extension=swoole.so(Linux)或extension=php_swoole.dll(Windows),不能漏掉.so - Swoole 编译时未启用协程依赖:如缺少
--enable-swoole-curl,会导致Swoole\Coroutine\Http\Client报Class not found
验证方式不是看宝塔界面,而是进容器或服务器终端执行:php -r "echo SWOOLE_VERSION;",有输出且 ≥4.5.0 才算真正就位。
使用 think-swoole 扩展时,server.php 配置必须显式启用协程
think-swoole 是官方推荐的集成包,但它默认不开启协程——这是最常被忽略的性能断点。在 config/swoole.php 中,必须手动设置:
'options' => [
'enable_coroutine' => true,
'hook_flags' => SWOOLE_HOOK_ALL,
],
否则即使 Swoole 扩展已装好,go(function () { ... }) 也不会真正协程化,数据库查询、Redis 调用仍会阻塞主线程。另外注意:hook_flags 推荐用 SWOOLE_HOOK_ALL,而非仅 SWOOLE_HOOK_TCP,否则 file_get_contents、PDO 等同步调用仍不协程化。
自定义 Swoole HTTP Server 时,App 实例不能重复初始化
网上很多示例在 on('request') 回调里反复 new App(),这在协程下极危险:
- 每次请求都重建 App 实例,路由、中间件、容器绑定全丢失,
$app->http->run()实际走的是“裸请求”,无法识别 ThinkPHP 的中间件和钩子 - 协程间共享的静态资源(如数据库连接池)可能被污染,出现
MySQL server has gone away
正确做法是提前实例化一次 App,并在回调中复用:
$app = new App();
$http = new \Swoole\Http\Server('0.0.0.0', 9502);
$http->on('request', function ($req, $res) use ($app) {
$response = $app->http->run($req, $res);
$res->end($response->getContent());
});
注意:此时 $app->http->run() 的第二个参数必须传入 $res,否则响应头、状态码会丢失。
守护进程启动必须加 -d 参数,且禁用 output_buffering
用 php think swoole:start 启动时若没加 -d(daemonize),服务会在前台运行,一关终端就退出;加了却仍挂掉,大概率是 PHP 配置冲突:
-
output_buffering = On会导致协程内 echo/print 输出被缓存,响应延迟甚至超时 -
max_execution_time = 30会让长连接(如 WebSocket)被强制中断,必须设为0 -
disable_functions若包含pcntl_fork或posix_kill,会导致think-swoole的热重载和进程管理失败
这些配置必须写在 CLI 模式的 php.ini 里(可通过 php --ini 查看路径),Web 和 CLI 的 php.ini 是两套,别只改了 Nginx 下的那一个。
协程不是开关,是贯穿整个生命周期的约束:从扩展编译参数、PHP 配置、App 初始化时机,到每个 I/O 调用是否真正挂起,环环相扣。最容易翻车的地方,永远是以为“装上了就能跑”,结果协程没真跑起来,还误以为性能瓶颈在业务代码里。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











