必须使用官方适配器(如think-swoole或laravel-swoole),手动写swoole\http\server极易漏掉$_server模拟、协程hook或异常捕获,导致500频发、内存泄漏或请求丢失;需验证swoole扩展同时启用http和coroutine,并确认版本≥5.x。

要在Swoole中让ThinkPHP或Laravel真正跑起来且不崩、不串态、不丢请求,必须绕过手动拼接$_SERVER和硬编码启动脚本的老路——官方适配器已封装好协程上下文、请求生命周期与自动重连,自己写Swoole\Http\Server极易漏掉$_SERVER模拟、协程Hook或异常捕获,上线后轻则500频发,重则内存泄漏拖垮整台服务器。
确认Swoole扩展可用且协程就绪
php -m | grep swoole只能说明扩展加载成功,不能证明能跑HTTP服务。必须执行:
php --ri swoole,检查输出中是否同时存在【http => enabled】和【coroutine => enabled】;若coroutine为disabled,需重新编译Swoole并加--enable-coroutine参数。
再运行php -r "echo swoole_version();",返回形如5.1.3的版本号才算通过。若报Call to undefined function swoole_version(),说明CLI和Web SAPI用的不是同一份php.ini,得用php --ini核对配置路径。
ThinkPHP 6/8 推荐集成路径
方法一:用topthink/think-swoole(唯一稳妥方案)
执行composer require topthink/think-swoole ——注意别装swoole/swoole,它与think-swoole冲突。
启动命令固定为php think swoole:server,该指令会自动构造完整$_SERVER(含REQUEST_URI、SCRIPT_NAME等),缺失会导致路由解析失败。
所有配置项必须写在config/swoole.php里,例如'worker_num' => 4必须显式设置,否则默认为1,压测时立刻卡死。
方法二:手动启动(仅限调试,禁止上生产)
创建swoole.php,内容含Swoole\Runtime::enableCoroutine(SWOOLE_HOOK_ALL);
在onRequest回调里,必须逐字段映射$request->server、$request->header、$request->get等至$_SERVER、$_GET等超全局变量;
【切勿在onRequest里直接echo或var_dump】——协程环境下会阻塞整个worker进程。
Laravel 集成关键动作
第一步:安装laravel-swoole扩展
执行composer require swooletw/laravel-swoole,然后运行php artisan vendor:publish --tag=laravel-swoole生成config/swoole_http.php,缺失此文件会导致404——Swoole根本没把请求桥接到Laravel内核。
第二步:关闭危险配置
将config/swoole_http.php中的'enable_static_handler' => true设为false,否则SPA项目因public下无真实静态文件而直接404;
禁用Session文件驱动,改用database或redis驱动,否则请求间session串扰致登录态丢失;
APP_URL必须设为http://127.0.0.1:1215这类纯HTTP地址,若写https://example.com,中间件会因协议不匹配拒绝请求。
第三步:重置Auth与DB连接
在onWorkerStart回调中手动调用Auth::logout()并重建Auth实例;
数据库连接必须每次查询前新建或从连接池取,DB::connection()返回的实例【不可跨协程复用】,否则连接会被上一个协程hold住导致Connection refused。
协程环境下的DB/Redis安全调用
方法一:ThinkPHP场景
启用co-mysql驱动,修改config/database.php中'type' => 'mysql'为'type' => 'co-mysql';
确保Swoole\Runtime::enableCoroutine(SWOOLE_HOOK_ALL)已在服务启动入口调用。
方法二:Laravel场景
停用phpredis和predis,改用co\Redis,并在连接前包裹go(function () { ... });
数据库层必须切换至hyperf/database + co-mysql驱动,Laravel原生PDO不支持协程,强行使用必卡死。
这一步操作起来很简单,但跳过它等于把整个worker进程交给阻塞调用托管——哪怕只是查一条数据,也会拖慢后续全部并发请求。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











