验证 Swoole 是否正确安装并启用协程的最直接方式是启动 swoole_http_server 并成功响应请求,同时通过 php --ri swoole 确认 Coroutine => enabled、epoll/openssl/http2 等关键特性已启用,且 CLI 与 Web 使用同一 php.ini。

swoole_http_server 启动成功就是最直接的验证方式,别急着写业务逻辑,先跑通一个最小可运行实例。
用 swoole_http_server 跑个 Hello World 看是否真生效
很多人装完就 php -m | grep swoole 看到扩展名就以为成了,但实际可能没加载进 CLI 或 FPM 环境——尤其是宝塔、Docker、多 PHP 版本共存时。
- 新建
test_http.php,内容严格按以下写(注意端口别被占用):
<?php
$server = new swoole_http_server('127.0.0.1', 9501);
$server->on('start', function ($server) {
echo "HTTP server started at http://127.0.0.1:9501\n";
});
$server->on('request', function ($request, $response) {
$response->header('Content-Type', 'text/plain');
$response->end("OK\n");
});
$server->start();
- 终端执行:
php test_http.php,看到HTTP server started...输出,说明扩展已加载且能初始化服务 - 另开终端
curl http://127.0.0.1:9501返回OK,证明网络层也通 - 如果卡在
start()不输出,或报Class 'swoole_http_server' not found,说明扩展没真正加载(检查是不是 CLI 和 Web 用的不是同一个php.ini)
确认协程功能是否可用(关键!很多新手漏这步)
新版 Swoole 默认启用协程,但如果你用的是旧版本编译安装、或 PHP 8.0+ 某些构建包,协程可能被禁用——而 go()、co::sleep() 这类 API 会直接报错或静默失败。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 执行:
php --ri swoole,重点看输出里有没有这一行:Coroutine => enabled - 没有?说明协程未启用。PECL 安装默认不带
--enable-coroutine,必须源码编译并加参数:./configure --enable-coroutine --with-php-config=/path/to/php-config - 简单验证协程是否工作:
<?php
go(function () {
co::sleep(0.1);
echo "done\n";
});
echo "before\n";
swoole_event_wait(); // 必须加这句,否则协程不调度
- 没输出
before\ndone,而是直接退出,说明协程调度器没启动或不可用
检查 swoole_server 和 swoole_http_server 的差异场景
新手常把 swoole_server 当成万能入口,但 HTTP 协议解析、路由、静态文件等都得自己写;而 swoole_http_server 内置了基础 HTTP 解析,适合快速验证。
-
swoole_server:裸 TCP 服务,收发原始字节流,适合自定义协议(如 IM、游戏网关) -
swoole_http_server:自动解析GET/POST、headers、cookies,$request->get、$request->post可直接用 - 别在
swoole_server上硬套 HTTP 请求——curl 发过去只会收到乱码,因为没做协议解析 - 测试时优先用
swoole_http_server,它对新手更友好,错误反馈也更明确
别跳过 php --ri swoole 的版本和编译选项检查
不同版本行为差异大:Swoole 4.8+ 默认关闭 enable_coroutine 的自动 Hook,而 5.0+ 对 OpenSSL、HTTP2 支持更严格。装完不看这个,后面连 Redis 或 MySQL 协程客户端都可能莫名失败。
- 执行
php --ri swoole后,除了确认Coroutine => enabled,还要扫一眼: -
version => 5.1.1(当前最新稳定版) -
epoll => enabled(Linux 必须有,否则性能差很多) -
openssl => enabled(HTTPS、Redis TLS 连接必需) -
http2 => enabled(如果要用 HTTP/2) - 如果这些是
disabled,光装扩展没用,得重编译加对应--enable-xxx参数
php --ri swoole 输出是否完整、CLI 和 Web 是否共用同一套配置——这三个点,比写多少 demo 都重要。漏掉任何一个,后续调试会陷入“代码没错但就是不工作”的黑洞。

















