必须启用ssl加密并显式开启http/2支持,否则服务端降级为http/1.1处理;编译需同时启用--enable-openssl和--enable-http2,运行时须配置swoole_sock_tcp|swoole_ssl、ssl_cert_file、ssl_key_file及open_http2_protocol=>true。

要在Swoole中正确响应HTTP/2协议的客户端请求,必须启用SSL加密并显式开启HTTP/2支持,否则即使客户端发起h2连接,服务端也只会按HTTP/1.1处理。
启用HTTP/2协议支持的前提配置
编译Swoole扩展时必须同时启用OpenSSL和HTTP/2支持,命令形如./configure --enable-openssl --enable-http2。若已安装但未启用,仅修改PHP配置无效,必须重新编译安装扩展。
确认是否生效:运行php --ri swoole,输出中需同时包含http2 => enabled和openssl => enabled两行。
【缺少任一支持会导致swoole_http_server无法识别HTTP/2握手,所有请求降级为HTTP/1.1】
创建支持HTTP/2的HTTPS服务器
使用swoole_http_server构造时,必须传入SWOOLE_SOCK_TCP | SWOOLE_SSL标志,并设置证书路径。
第一步:准备有效SSL证书文件(ssl.crt和ssl.key),不能使用自签名证书且未受信任的证书——现代浏览器会直接拒绝HTTP/2协商。
第二步:实例化服务器并开启HTTP/2协议:
$serv = new swoole_http_server("0.0.0.0", 9501, SWOOLE_BASE, SWOOLE_SOCK_TCP | SWOOLE_SSL);
第三步:在$serv->set()中启用open_http2_protocol => true,并指定证书路径:
$serv->set([ 'ssl_cert_file' => '/path/to/ssl.crt', 'ssl_key_file' => '/path/to/ssl.key', 'open_http2_protocol' => true,]);
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
注意:Swoole目前仅支持基于TLS的h2模式(即HTTPS + HTTP/2),不支持明文h2c或Upgrade机制。
处理HTTP/2请求的业务逻辑
注册request事件回调即可,无需区分HTTP/1.1或HTTP/2——Swoole底层自动完成协议解析,$request对象字段与HTTP/1.1完全一致。
可直接读取$request->get、$request->post、$request->header、$request->cookie等属性,行为无差异。
响应方式也相同:$response->header()、$response->cookie()、$response->end()均可正常使用。
唯一区别在于:当客户端通过HTTP/2连接发送多个并发请求时,Swoole会自动复用同一TCP连接,无需额外编码即可获得多路复用收益。
验证HTTP/2是否生效
方法一:使用curl命令检查协议版本:
curl -I --http2 https://localhost:9501/ --insecure → 响应头中应出现HTTP/2 200。
方法二:Chrome浏览器打开开发者工具→Network标签页→右键表头→勾选“Protocol”,刷新页面后查看对应请求显示为“h2”。
方法三:在request回调中打印$request->server['request_method']和$request->server['server_protocol'],后者值应为HTTP/2.0。
如果始终显示HTTP/1.1,请立即检查SSL证书路径是否正确、文件是否可读、端口是否被防火墙拦截、以及客户端是否真正发起了HTTP/2请求(例如用curl --http2而非curl --http1.1)。










