Workerman提示“Undefined index: HTTP_HOST”怎么解决?

秋静姑娘_4965

秋静姑娘_4965

2026-05-24

253人浏览

原创

workerman 中 $_server['http_host'] 未定义是因为其 http 解析器不初始化完整 $_server 数组;应通过 $http->host() 或 $http->header('host') 获取 host 头。

workerman提示“undefined index: http_host”怎么解决?

Workerman 的 HTTP_HOST 不是自动注入的全局变量,直接读 $_SERVER['HTTP_HOST'] 会报 Undefined index: HTTP_HOST —— 因为 Workerman 的 HTTP 协议解析器不默认填充全部 CGI 环境变量,$_SERVER 是空的或极简的。

为什么 $_SERVER 里没有 HTTP_HOST?

Workerman 的 Worker 类(尤其是 WebServer 或直接 new Worker('http://0.0.0.0:8080'))使用自研 HTTP 解析器,不走 PHP-FPM 的 CGI 流程,所以不会初始化完整的 $_SERVER 数组。常见被误用的键还有 REQUEST_URI、QUERY_STRING、HTTP_REFERER 等。

你看到的错误通常出现在:

  • 直接在 onMessage 里写 $_SERVER['HTTP_HOST']
  • 搬了传统 Apache/Nginx 下的 PHP 路由逻辑过来,没适配 Workerman 的请求对象
  • 用了框架封装但没搞清底层——比如 ThinkPHP 的 Workerman 扩展若未开启 HTTP 上下文代理,$_SERVER 仍是空的

正确获取 Host 和请求信息的方式

Workerman 的 HTTP 请求数据全在 $http 对象(即 $connection 参数)上,它是 Workerman\Protocols\Http\Request 实例。

你应该这样取:

Cutout.Pro抠图
Cutout.Pro抠图

一款提供AI自动抠图和背景移除能力的图片处理工具,可快速提取人物、商品等主体并支持批量处理视觉素材。

下载
  • $http->host() → 返回 Host 头的值(如 example.com:8080)
  • $http->header('host') → 手动取原始 Host 头(小写键名)
  • $http->uri() → 替代 $_SERVER['REQUEST_URI']
  • $http->method() → 替代 $_SERVER['REQUEST_METHOD']
  • $http->get() / $http->post() → 替代 $_GET / $_POST

示例:

use Workerman\Protocols\Http\Request;

$worker = new Worker('http://0.0.0.0:8080');
$worker->onMessage = function($connection, $http) {
    // ✅ 正确
    $host = $http->host();
    $path = $http->uri();
    
    // ❌ 错误(会触发 Undefined index)
    // $host = $_SERVER['HTTP_HOST'];
    
    $connection->send("Host: {$host}, Path: {$path}");
};

如果必须兼容旧代码(比如引入第三方库依赖 $_SERVER)

可以手动补全关键 $_SERVER 字段,但仅限必要项,且要在 onMessage 开头做:

  • 只设置你真正在用的键,避免污染全局
  • 优先用 $http->header() 取值,再赋给 $_SERVER,别硬编码
  • 注意 Host 头可能带端口,需按需截取(parse_url($host, PHP_URL_HOST))

示例:

$worker->onMessage = function($connection, $http) {
    $_SERVER['HTTP_HOST'] = $http->header('host') ?: 'localhost';
    $_SERVER['REQUEST_URI'] = $http->uri();
    $_SERVER['REQUEST_METHOD'] = $http->method();
    
    // 后续可安全调用依赖 $_SERVER 的旧逻辑
    require 'legacy_router.php';
};

最易被忽略的是:很多人在 onConnect 或 onWorkerStart 里试图读 $_SERVER,那连请求上下文都没有,必然为空——Host 只存在于 HTTP 请求头里,必须在 onMessage 中、有 $http 对象时才能取。

相关专题

更多
undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

2023.07.31

11505

4

网页undefined是什么意思
网页undefined是什么意思

网页undefined是指页面出现了未知错误的意思,提示undefined一般是在开发网站的时候定义不正确或是转换不正确,或是找不到定义才会提示undefined未定义这个错误。想了解更多的相关内容,可以阅读本专题下面的文章。

2024.08.14

5487

7

网页undefined啥意思
网页undefined啥意思

本专题整合了undefined相关内容,阅读下面的文章了解更多详细内容。后续继续更新。

2025.12.25

2516

7

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.09

3103

4

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

2023.11.14

834

3

HTTP 503错误解决方法
HTTP 503错误解决方法

HTTP 503错误表示服务器暂时无法处理请求。想了解更多http错误代码的相关内容,可以阅读本专题下面的文章。

2024.03.12

6246

8

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.08.16

5310

6

Go 语言 HTTP 编程与中间件开发教程合集
Go 语言 HTTP 编程与中间件开发教程合集

全面讲解 Go 语言 HTTP 编程的核心知识,涵盖 net/http 标准库的 Server/Handler/HandlerFunc 体系、DefaultServeMux 路由注册与自定义路由器、Request / ResponseWriter 请求响应处理、中间件(Middleware)链式设计模式与常见中间件(日志/CORS/认证/限流)开发、http.Client 的超时配置与连接池管理、Cookie / Session 处理、

2026.05.08

421

31

Workerman安装配置教程
Workerman安装配置教程

Workerman安装配置教程专题提供Workerman安装配置、WebSocket开发、TCP通信、异步编程、高并发服务搭建与PHP实时通信开发教程。

2026.05.20

166

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Webman中文手册
Webman中文手册

共0课时 | 0人学习

Workerman官方手册
Workerman官方手册

共0课时 | 0人学习

ThinkPHP5.1完全开发手册
ThinkPHP5.1完全开发手册

共0课时 | 0人学习