Swoole 是 PHP 的 C 扩展,通过常驻主进程与工作进程实现长生命周期服务,需显式编写回调逻辑、剥离超全局变量依赖、预加载资源并复用,而非直接执行传统 PHP 脚本。

Swoole 不是 PHP 的替代运行环境,它本身是 PHP 的一个扩展,所以「在 Swoole 中运行 PHP 脚本」这个说法容易误解——真正要做的是:用 Swoole 扩展启动一个长期运行的服务进程,然后在这个进程中加载、调用你自己的 PHP 逻辑。
直接执行 php your_script.php 和用 Swoole 启动服务,是两种完全不同的生命周期模型。前者是短生命周期、一次请求即结束;后者是常驻内存、事件驱动、可复用上下文的长生命周期服务。
怎么让传统 PHP 脚本适配 Swoole 长驻模式
Swoole 服务启动后不会自动加载或执行任意 PHP 文件,你必须显式把业务逻辑写进回调里,或者封装成可调用的类/函数再引入。
-
require或include你的脚本文件是可行的,但要注意:立即学习“PHP免费学习笔记(深入)”;
- 不要包含
exit、die、全局输出(如echo)等会中断服务流程的语句 - 避免依赖
$_GET/$_POST等超全局变量(HTTP 场景下要用$request->get、$request->post) - 类自动加载需提前配置好(如
spl_autoload_register或 Composer 的autoload)
- 不要包含
-
示例:把一个简单处理逻辑抽成函数,在 HTTP 回调中调用
// handler.php function process_user_data($uid) { return ['status' => 'ok', 'data' => ['id' => $uid, 'name' => 'demo']]; } </li></ul><p>// server.php require 'handler.php';</p><p>$http = new Swoole\Http\Server('0.0.0.0', 9501); $http->on('request', function ($request, $response) { $uid = $request->get['uid'] ?? 1; $result = process_user_data($uid); $response->header('Content-Type', 'application/json'); $response->end(json_encode($result)); }); $http->start();
为什么不能直接
php your_script.php启动 Swoole 服务因为 Swoole 的核心组件(如
Swoole\Http\Server、Swoole\Server)必须在 CLI 模式下初始化,并且依赖底层事件循环持续运行。一旦脚本执行完就退出,服务就没了。常见错误现象:
PHP Fatal error: Uncaught Error: Class 'Swoole\Http\Server' not found
→ 没启用扩展,检查php -m | grep swoole和php --ri swoole另一种错误:
Segmentation fault (core dumped)
→ 多半是 PHP 版本与 Swoole 版本不兼容(例如 PHP 8.3 + Swoole 4.8.x),建议用 Swoole 5.0+ 对应新版 PHP还有一种隐形坑:脚本里用了
sleep()、file_get_contents()等同步阻塞调用
→ 在协程环境中会挂起整个 worker,改用co::sleep()、Co\Http\Client等协程 API
ThinkPHP/Laravel 等框架如何接入 Swoole
不是“把框架丢进 Swoole”,而是用 Swoole 替换框架默认的 PHP-FPM 请求入口,让框架运行在 Swoole 的请求生命周期内。
-
ThinkPHP:需手动模拟请求上下文,不能直接用
index.php入口- 必须定义
define('MODE_NAME', 'cli') - 实例化
Swoole\Http\Server后,在request回调中调用 TP 的think\App实例并传入$request对象 - 注意命名空间问题:实例化
Swoole\Http\Server时前面加反斜杠,即\Swoole\Http\Server,否则可能被 TP 自动加载器误解析
- 必须定义
-
Laravel:推荐用
swooletw/laravel-swoole包,它封装了请求转发、生命周期钩子、热重载等细节- 它本质仍是启动一个
Swoole\Http\Server,再把每个$request转给 Laravel 的内核处理 - 切记:Laravel 的
config、cache、session等单例在长驻进程中会复用,需避免静态变量污染
- 它本质仍是启动一个
关键点在于:Swoole 不是“运行 PHP 脚本的容器”,它是让你重写 PHP 的执行模型——从每次请求新建进程,变成复用 worker、协程调度、异步 I/O。所有原有脚本都得按这个新模型重构或包装,而不是“扔进去就能跑”。最容易被忽略的是状态残留(比如数据库连接未释放、全局变量跨请求污染、缓存未刷新),这些在短生命周期里无关紧要,但在 Swoole 常驻进程中会直接导致线上故障。



















