Workerman必须显式启用HTTP协议才能处理Web请求,否则onMessage仅接收原始字节流,无法解析HTTP方法、Header和Body;监听地址需写为http://0.0.0.0:2345,引入Workerman\Protocols\Http\Request类,通过$request->get()、$request->post()等方法获取参数,响应时须手动设置Content-Type和状态码,HTTP/2需严格配置SSL且不支持自签名证书。

Workerman必须显式启用HTTP协议才能处理Web请求
Workerman默认启动的是裸TCP服务,onMessage收到的只是原始字节流,没有请求方法、Header、Body解析能力。浏览器或curl发来的HTTP请求会被当成乱码,$_POST、$_GET永远为空——这不是配置错误,是协议栈根本没加载。
实操建议:
- 监听地址必须写成
http://0.0.0.0:2345(不是tcp://或只写端口) - 确保已引入
Workerman\Protocols\Http\Request,但无需手动实例化,框架自动注入 - Windows下注意关闭占用端口的程序(如IIS、Skype),否则
Worker::runAll()会静默失败 - 用
curl -v http://127.0.0.1:2345测试连通性,别依赖浏览器地址栏——它可能缓存304或跳HTTPS
onMessage里怎么拿到GET参数和POST数据
$request 是 Workerman\Protocols\Http\Request 实例,不是超全局数组。所有解析都得靠它主动取,且不同Content-Type走不同路径。
常见错误现象:$request->post() 返回空数组,但curl确认带了 -d "name=foo" ——大概率是客户端没发 Content-Type: application/x-www-form-urlencoded,或者用了JSON但误调了 post()。
实操建议:
-
$request->get()拿URL查询参数,支持嵌套如?a[b]=1 -
$request->post()只处理application/x-www-form-urlencoded和multipart/form-data;上传文件必须带正确boundary,否则$request->file()为空 - JSON请求必须用
$request->rawBody()拿原始字符串,再json_decode($request->rawBody(), true) - 不要尝试在
onMessage中 require ThinkPHP/Laravel 入口文件——它们强依赖$_POST填充机制,会直接报错或返回空数组
为什么响应头不生效或中文乱码
Workerman HTTP Server 不自动设置 Content-Type,也不做字符编码推断。直接 $connection->send('你好') 会被浏览器当 ISO-8859-1 解析。
性能影响:频繁调用 $connection->sendHeader() 多次发送状态行和头字段,不如拼成完整响应体一次发完,减少系统调用开销。
实操建议:
- 发送HTML/JSON前务必加头:
$connection->header('Content-Type', 'text/html; charset=utf-8') - 状态码要手写完整响应行:
$connection->send("HTTP/1.1 404 Not Found\r\nContent-Type: text/plain\r\n\r\nNot found") - 避免在循环里反复
send()小块数据;大文件下载建议用fopen()+fpassthru()配合Connection: close头,防止连接复用干扰 - 调试时用
var_dump($request->header)看客户端实际发了什么头,别猜
HTTP/2需要SSL且配置极易出错
Workerman 的 Http2 协议强制要求 TLS,且不接受自签名证书的宽松校验(verify_peer => false 仅对客户端有效)。配置错一个路径,进程直接退出,日志里只报 ssl handshake failed。
容易踩的坑:
-
local_cert和local_pk必须是绝对路径,相对路径在守护进程模式下会失效 - 证书链不完整(比如缺中间CA)会导致 Chrome 显示
ERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY -
$worker->protocol = "Http2"必须配合$worker->transport = "ssl",漏掉任一就退化成HTTP/1.1 - HTTP/2 不支持
Connection: keep-alive头,别手动加,框架自动管理多路复用
复杂点在于:HTTP/2 的服务器推送(Server Push)、头部压缩(HPACK)等功能需客户端明确支持,Workerman只提供协议层,业务逻辑仍需自己组织资源依赖关系。别指望开个开关就自动优化页面加载速度。

















