workerman中获取cookie值的正确方式是调用全局静态方法http::input('cookie.xxx'),其中xxx为cookie名;不可使用$_cookie或$request->cookie,因workerman不自动填充超全局变量或request属性。

Workerman里怎么拿到请求中的Cookie值
Workerman不提供request.getCookies()这种Java风格的数组式获取方式,也不直接暴露原始Cookie请求头字符串。它把解析后的键值对自动注入到Http::input()统一入口中。
正确做法是用Http::input('cookie.xxx'),其中xxx是你要取的cookie名:
-
Http::input('cookie.PHPSESSID')→ 获取PHP会话ID -
Http::input('cookie.token')→ 获取自定义认证token - 如果cookie不存在,返回
null;可加默认值:Http::input('cookie.user_id', 'guest')
注意:Http::input()是全局静态方法,必须在onMessage回调里调用,且依赖Workerman\Protocols\Http已加载(通常自动完成)。别试图从$request->header['cookie']手动解析——格式不标准、含Domain/Path等元信息,容易出错。
为什么request->cookie或$_COOKIE在Workerman里无效
Workerman不是传统PHP-FPM模型,它不触发php.ini的auto_globals_jit机制,也不执行register_globals流程,所以$_COOKIE始终为空数组。同样,$request对象本身没有cookie属性,直接访问$request->cookie会报Undefined property错误。
根本原因是:Workerman的Http协议解析器只将Cookie头按key=value拆解后存入内部input缓存,不写入超全局变量,也不挂载到Request实例上。
- 错误写法:
echo $_COOKIE['user'];→ 输出空 - 错误写法:
var_dump($request->cookie);→ Notice: Undefined property - 正确路径只有
Http::input('cookie.xxx')这一条
复用Cookie做免登录时要注意域和路径匹配
用Http::setcookie()下发Cookie时,若想让前端JS或后续请求能读到,必须显式指定path和domain参数,否则默认path='/'但domain为空,浏览器可能拒绝发送。
- 设成
Http::setcookie('token', 'abc123', time()+3600, '/', '.example.com'),才能被api.example.com和www.example.com共用 - 如果前端发请求时Host是
localhost:8080,但服务端设了domain='.example.com',浏览器会直接丢弃该Cookie - 复用旧Cookie前,建议先用
Http::input('cookie.token')校验是否存在且未过期,再决定是否跳过登录逻辑
另外,Workerman默认不校验Cookie签名,所有Http::input('cookie.xxx')读出的值都是明文,敏感字段(如用户ID)务必配合服务端session或JWT验证,不能仅靠Cookie值信任客户端。
调试时如何确认Cookie是否真的传进来了
最直接的办法是打印完整请求头,看原始Cookie字段有没有数据:
var_dump($request->header['cookie'] ?? 'no cookie header');
如果输出string(0) ""或no cookie header,说明客户端根本没带——常见于前端Axios/Fetch没设credentials: 'include',或跨域时没配Access-Control-Allow-Credentials: true。
- Axios示例:
axios.get('/api/user', { withCredentials: true }) - Fetch示例:
fetch('/api/user', { credentials: 'include' }) - 纯curl测试:
curl -H "Cookie: user_id=123" http://127.0.0.1:8080/api/user
别依赖浏览器开发者工具的“Application → Cookies”面板来判断后端是否收到——那只是浏览器存储的副本,和服务端实际接收到的请求头无关。











