应使用 $response->status() 设置HTTP状态码,它在Swoole中唯一可靠;手动header()无效且可能报错,必须在end()前调用,传入整数,重复调用end()会报错。

直接用 $response->status(),别写 header('HTTP/1.1 404 Not Found') —— 那样在 Swoole 里不生效,还可能报错。
status() 是唯一可靠的方式
Swoole 的 swoole_http_response 对象封装了底层协议处理逻辑,status() 方法会正确设置响应行(如 HTTP/1.1 403 Forbidden),并影响后续的 end() 行为。手动调用 PHP 原生 header() 不仅无效,还可能触发 Cannot modify header information 警告,因为 Swoole 已接管 HTTP 头发送流程。
-
$response->status(404)必须在$response->end()之前调用 - 如果没显式调用
status(),默认是200 - 状态码必须是整数,传字符串如
"404"会导致静默失败或返回500 - 不能在
end()之后再调用status()—— 此时响应已发出,调用无效
常见错误:混用 status() 和 header()
有人试图用 header('HTTP/1.1 401 Unauthorized') 模拟状态码,结果发现浏览器收到的是 200 OK,但页面内容却是“Unauthorized”。这是因为:header() 在 Swoole 中只是往响应头里塞了个普通字段,而协议状态行由 status() 单独控制;两者不联动,且 Swoole 会忽略非法的 HTTP/ 开头的 header() 调用。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 错误写法:
header('HTTP/1.1 401 Unauthorized'); $response->end('...') - 正确写法:
$response->status(401); $response->end('Unauthorized') - 如果还要设
WWW-Authenticate头,用$response->header('WWW-Authenticate', 'Bearer')单独加
status() 和 end() 的顺序不能颠倒
status() 只是设置内部状态,真正把状态行、头、body 一起发出去的是 end()。所以如果你只调用了 status(500) 但忘了 end(),客户端会一直等待,直到超时断连。
- 典型漏写:
$response->status(500); // 缺少 end() → 连接挂起 - 重复调用
end()会报错:Warning: Swoole\Http\Response::end(): cannot send response body twice - 想提前终止响应?用
$response->end()就够了,它隐式使用当前 status(默认 200)
最容易被忽略的一点:Swoole 的 status() 不校验状态码是否在标准范围内(比如传 999 也会发出去),但某些代理或 CDN 可能拒绝转发非标准码。线上环境建议只用 RFC 7231 定义的合法状态码。

















