必须同时满足编译启用--enable-http2和--enable-openssl、php配置加载扩展、代码中设置open_http2_protocol=>true并绑定ssl套接字,三者缺一不可。

要在宝塔面板中让 PHP 8.0(或更高版本)的 Swoole 扩展真正支持 HTTP/2 协议,必须同时满足编译层、配置层和运行层三重条件:Swoole 编译时启用 【--enable-http2 和 --enable-openssl】,PHP 配置中加载扩展,且服务端代码显式开启 open_http2_protocol => true 并绑定 SSL/TLS 套接字。
确认 Swoole 是否已编译支持 HTTP/2 和 OpenSSL
执行命令:/www/server/php/80/bin/php --ri swoole,检查输出中是否同时存在 http2 => enabled 和 openssl => enabled。若任一缺失,说明当前 Swoole 是“假安装”——即使 php -m 看得见 swoole,HTTP/2 功能仍完全不可用。
常见失效场景:宝塔软件商店安装的 Swoole 默认不启用 --enable-http2(尤其 PHP 8.0/8.1 版本),此时必须手动重装。
手动编译安装带 HTTP/2 支持的 Swoole(推荐路径)
第一步:进入临时目录并下载源码(以 swoole-5.1.5 为例)
cd /www/server && wget https://pecl.php.net/get/swoole-5.1.5.tgz && tar -zxvf swoole-5.1.5.tgz && cd swoole-5.1.5
第二步:调用对应 PHP 版本的 phpize 工具
【/www/server/php/80/bin/phpize】(数字 80 必须与你实际使用的 PHP 子目录严格一致)
第三步:configure 必须包含两个关键参数
./configure --with-php-config=/www/server/php/80/bin/php-config --enable-openssl --enable-http2
漏掉 --enable-http2,后续所有配置都无效;漏掉 --enable-openssl,SSL 握手会失败。
第四步:编译安装并记录扩展路径
make && make install
终端将输出类似 Installing shared extensions: 【/www/server/php/80/lib/php/extensions/no-debug-non-zts-20200930/】——这个路径后面要用。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
双 php.ini 同步启用 Swoole 扩展
方法一:CLI 与 FPM 配置必须分别编辑
FPM 加载的是:/www/server/php/80/etc/php.ini
CLI 加载的是:/www/server/php/80/bin/php.ini
两个文件末尾都追加同一行:extension=swoole.so
注意:新版 Swoole(如 5.1+)可能要求写成 extension=swoole(无 .so),但优先以 php --ri swoole 实际输出的模块名为准。
改完后必须点击宝塔面板中对应 PHP 版本的「重启」按钮(不是「重载」)——重载不会重建 PHP 进程,旧进程仍不加载新扩展。
编写 HTTP/2 服务代码并验证
创建 test_http2.php 文件,内容如下:
$server = new Swoole\Http\Server('0.0.0.0', 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP | SWOOLE_SSL);
$server->set([
'ssl_cert_file' => '/www/wwwroot/your-domain.com/fullchain.pem',
'ssl_key_file' => '/www/wwwroot/your-domain.com/privkey.pem',
'open_http2_protocol' => true,
]);
$server->on('request', function ($request, $response) {
$response->end("HTTP/2 OK");
});
$server->start();
关键点:
① socket 类型必须是 【SWOOLE_SOCK_TCP | SWOOLE_SSL】,纯 TCP 不支持 HTTP/2;
② open_http2_protocol 必须是布尔值 true,不能写成字符串或数字;
③ 证书路径要真实可读,私钥不能设密码,权限建议为 600 且属主为 www。
运行:/www/server/php/80/bin/php test_http2.php
用 curl 测试:curl -k --http2 https://127.0.0.1:9501,返回 HTTP/2 200 即成功。










