workerman 4.0.20 部署后空白页的五大原因及解决:1. 必须用 http:// 协议启动;2. 手动设置 content-type 和 charset=utf-8 响应头;3. 确保 runtime 目录可写;4. 开启 display_errors 并检查 error_log;5. 使用 $http 对象而非 $_server 获取请求信息。

Workerman 4.0.20 部署后浏览器打开只显示空白页,无任何错误提示、无 HTML 渲染、控制台也无报错,问题往往藏在 HTTP 协议解析缺失、响应头未设置或 runtime 目录不可写等隐蔽环节,必须逐层验证。
确认服务是否真正监听 HTTP 协议
Workerman 默认启动的是裸 TCP 服务,若监听地址写成 tcp://0.0.0.0:2345 或仅写端口号,onMessage 收到的只是原始字节流,无法解析 GET/POST、Header 和 Body——浏览器发来的 HTTP 请求会被当成乱码丢弃,直接返回空白页。
打开你的 start.php,检查 Worker 实例化语句:$worker = new Worker('http://0.0.0.0:2345');。协议必须明确写为 http://,不能是 text://、tcp:// 或省略协议。
执行 php start.php status,确认输出中包含 Listening at http://0.0.0.0:2345;若显示 text:// 或无协议标识,立即修正并重启服务。
强制设置响应头与字符集
Workerman HTTP Server 不自动设置 Content-Type,也不推断编码。直接 $connection->send('<h1>Hello</h1>') 会被浏览器按 ISO-8859-1 解析,中文全部乱码或直接不渲染,表现为视觉空白。
在 $worker->onMessage 回调中,必须手动发送标准 HTTP 响应头:
$connection->header('Content-Type', 'text/html; charset=utf-8');
这一步不可跳过。如果返回 JSON,改用 'application/json; charset=utf-8';若漏掉 charset=utf-8,哪怕 HTML 标签正确,中文内容也会触发浏览器静默降级,页面留白。
检查 runtime 目录写入权限
ThinkPHP 或 Webman 等基于 Workerman 的框架依赖 runtime 目录生成缓存、日志和会话文件。权限不足时,框架初始化失败但不抛异常,最终只返回空响应体。
执行命令:ls -ld runtime(Linux/macOS)或 icacls runtime(Windows),确认当前运行 PHP 进程的用户(如 www-data、nginx 或你自己的账户)对该目录有读写权限。
临时修复(开发环境):chmod -R 755 runtime;生产环境需严格限定属主:chown -R www-data:www-data runtime。
开启 PHP 错误显示并捕获致命错误
空白页最常因语法错误、类未找到或 require 失败导致,但 PHP 配置中 display_errors = Off 会屏蔽所有提示,只剩白屏。
第一步:在 start.php 顶部立即插入两行:
ini_set('display_errors', 'on');
error_reporting(E_ALL);
第二步:检查 php.ini 中 log_errors = On 是否启用,并定位 error_log 路径(如 /var/log/php_errors.log),重启服务后访问一次,立刻查看该日志是否有 Parse error、Class not found 等记录。
注意:不要依赖浏览器开发者工具 Network 标签判断成功与否——HTTP 状态码 200 + 空响应体也是空白页的典型表现。
验证 $_SERVER 变量使用是否合规
Workerman 的 HTTP 解析器不初始化完整 $_SERVER 数组,直接读取 $_SERVER['HTTP_HOST'] 或 $_SERVER['REQUEST_URI'] 会触发 Undefined index 警告,而该警告在 display_errors=Off 时被静默吞掉,最终响应中断、页面空白。
正确做法是通过 $http 对象获取:
方法一:在 onMessage 回调中,确保参数签名是 function($connection, $http)(不是 $data);
方法二:用 $http->host() 替代 $_SERVER['HTTP_HOST'],用 $http->uri() 替代 $_SERVER['REQUEST_URI'];
方法三:若必须兼容旧逻辑,可在回调开头手动补全:$_SERVER['HTTP_HOST'] = $http->header('host') ?: 'localhost';,但仅限必要字段,避免污染全局变量。











