php 8.1 是运行 swoole 5.0 的最低要求,需满足版本约束、扩展启用、协程初始化和服务器模型切换四条件;执行 php -v、php --ri swoole、composer --version 验证三要素;入口处调用 runtime::enablecoroutine(true) 和 sethookflags;改用 co\http\server;通过 ab 压测与 co::getcid() 日志验证协程生效。

PHP 8.1 是运行 Swoole 5.0 的最低要求,配置异步服务需同时满足版本约束、扩展启用、协程环境初始化和服务器模型切换四方面。跳过任一环节都可能导致服务无法启动、路由不生效或协程不调度。
确认基础环境三要素
缺一不可,顺序不能颠倒:
- 执行 php -v,确保输出为 PHP 8.1.x 或更高版本(Swoole 5.0 完全放弃 PHP 7.x 支持)
- 执行 php --ri swoole,检查是否已启用,且版本显示为 5.0.x;若未安装,用
pecl install swoole安装,并在php.ini中添加extension=swoole.so - 执行 composer --version,确认为 2.5+(Hyperf 等主流框架依赖新版 Composer 解析协程组件约束)
启用协程运行时与自动 Hook
Swoole 5.0 默认不自动 Hook 所有 I/O 函数,必须显式开启,否则 file_get_contents、curl_exec 等仍会阻塞:
- 在服务入口(如
server.php或bin/hyperf.php)最顶部加入:
use Swoole\Runtime; Runtime::enableCoroutine(true); Runtime::setHookFlags(SWOOLE_HOOK_ALL);
- 该配置使所有标准 PHP I/O 函数(含 PDO、Redis、Stream)自动转为协程非阻塞调用,无需改写业务代码
使用 Co\Http\Server 替代旧版服务器
Swoole 5.0 废弃 swoole_http_server 类,统一使用协程化 Co\Http\Server:
- 最小可运行示例:
use Swoole\Coroutine\Http\Server;
use Swoole\Http\Request;
use Swoole\Http\Response;
$server = new Server('0.0.0.0', 9501, false); // 第三个参数 false 表示不启用 SSL
$server->handle('/', function (Request $request, Response $response) {
$response->header('Content-Type', 'application/json');
$response->end(json_encode(['status' => 'ok', 'time' => time()]));
});
$server->start();
- 注意:此服务器基于协程,所有回调函数内可直接使用
Co\MySQL、Co\Redis等协程客户端,无需go()包裹 - 监听地址建议用
0.0.0.0而非127.0.0.1,便于容器或远程调试访问
验证协程是否真实生效
仅靠服务启动成功不代表协程在工作。推荐两个快速验证方式:
-
并发请求测试:用
ab -n 100 -c 50 http://127.0.0.1:9501/压测,观察 CPU 占用是否平稳(协程模式下应远低于传统 FPM)、无连接超时 -
日志注入检测:在请求回调中加一行
var_dump(Co::getCid());,多次刷新页面,若输出 CID(协程 ID)持续变化且不重复,说明每次请求都在独立协程中执行
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











