$response->cookie()必须在end()前调用,参数按位置顺序匹配setcookie(),v4.4.6+支持大小写敏感的'Strict'/'Lax'/'None' SameSite值且'None'需配合$secure=true,$value默认urlencode,可用rawCookie()禁用编码。

$response->cookie() 必须在 $response->end() 之前调用,否则无效;它不是 PHP 原生的 setcookie(),不走 SAPI 层,而是直接写入 HTTP 响应头。
cookie() 参数顺序和默认值容易填错
Swoole 的 cookie() 方法参数顺序与 PHP 原生 setcookie() 一致,但**没有命名参数**,靠位置决定含义。v4.4.6+ 支持 $samesite,但必须按顺序补全前面所有参数(不能跳过 $domain 或 $secure)。
-
$name和$value是必填,$value为空字符串也合法 -
$expire是 Unix 时间戳(非秒数偏移),设为0表示会话 Cookie -
$path默认是'/',但若你服务部署在子路径(如/api/),需显式传'/api/' -
$domain若填'example.com',则.example.com会被自动补点;填'.example.com'会变成'..example.com'—— 导致无效 -
$secure和$httponly是布尔值,传1或'1'都会被转成true,但建议严格用true/false
SameSite 设置必须注意版本和拼写
$samesite 参数从 Swoole v4.4.6 开始支持,只接受 'Strict'、'Lax'、'None' 三种字符串(大小写敏感),且 'None' 必须配合 $secure = true,否则浏览器拒绝接收。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 低版本 Swoole(如 v4.4.5 及以前)传入
$samesite会被静默忽略,但不会报错 - 拼写错误如
'lax'或'same-site'会导致整个 Cookie 头被丢弃 - 若需兼容老客户端,建议先检查
SWOOLE_VERSION,再决定是否传$samesite
value 自动 urlencode,但 rawCookie() 可绕过
Swoole 默认对 $value 调用 urlencode(),这是为了符合 RFC 规范,但如果你传的是 Base64 字符串或 JWT Token,可能因双重编码出问题。
- 例如传
cookie('token', 'eyJhbGciOi...'),实际发出去会变成eyJhbGciOi%2... - 想禁用自动编码,改用
$response->rawCookie($name, $value, ...),它不处理$value,但其余逻辑(如Expires、Path构造)完全一致 -
rawCookie()同样受end()时机限制,且同样支持$samesite
最易被忽略的一点:Swoole 不校验 $domain 是否匹配请求 Host,也不会自动添加 Secure 标志——哪怕你用 HTTPS 反代。如果 Nginx 终止 HTTPS 并以 HTTP 转发给 Swoole,而你又设了 $secure = true,浏览器就收不到这个 Cookie。

















