在PHP后端开发中,HTTP状态码是服务端向客户端反馈请求处理结果的重要标识,不同的状态码对应不同的请求状态,比如200表示请求成功,404表示资源不存在,500表示服务端内部错误。合理设置HTTP状态码能够让前端更清晰地判断请求是否正常处理,减少不必要的联调成本。

PHP设置HTTP状态码的两种常用方法
1. 使用header函数设置
header函数是PHP中用于发送原生HTTP头信息的核心函数,我们可以通过发送Status头部来设置HTTP状态码。需要注意的是,使用header函数之前不能有任何输出,否则会触发错误。
使用header设置状态码的基本语法如下:
<?php
// 设置404状态码
header("HTTP/1.1 404 Not Found");
// 设置500状态码
header("HTTP/1.1 500 Internal Server Error");
// 设置201状态码(创建成功)
header("HTTP/1.1 201 Created");
?>
这种方式需要手动拼接HTTP协议版本、状态码和状态描述,适合需要自定义状态描述的场景,但是需要注意格式必须正确,否则可能不会被客户端正确识别。
2. 使用http_response_code函数设置
http_response_code是PHP内置的专门用于设置和获取HTTP状态码的函数,从PHP 5.4版本开始支持,使用起来比header函数更简洁,不需要手动拼接协议版本和状态描述。
该函数的基本用法如下:
<?php // 设置200状态码 http_response_code(200); // 设置404状态码 http_response_code(404); // 获取当前设置的状态码 $code = http_response_code(); echo $code; // 输出404 ?>
如果只传入状态码参数,函数会设置对应的HTTP状态码,如果传入的状态码没有对应的默认描述,PHP会自动填充标准的状态描述。如果不传入参数,函数会返回当前设置的HTTP状态码。
两种方法的对比
我们可以通过下面的表格对比两种设置方式的差异:
| 对比项 | header函数 | http_response_code函数 |
|---|---|---|
| PHP版本要求 | 所有PHP版本 | PHP 5.4及以上 |
| 使用复杂度 | 需要手动拼接完整状态行 | 只需要传入状态码数字 |
| 自定义状态描述 | 支持自定义 | 只能使用标准描述 |
| 返回值 | 无返回值 | 设置时返回旧状态码,获取时返回当前状态码 |
常见HTTP状态码及使用场景
在实际开发中,我们不需要记住所有的HTTP状态码,只需要掌握常用的几类即可:
- 2xx 成功类:200表示请求成功,201表示资源创建成功,204表示请求成功但无返回内容。
- 3xx 重定向类:301表示永久重定向,302表示临时重定向,304表示资源未修改,可使用缓存。
- 4xx 客户端错误类:400表示请求参数错误,401表示未授权,403表示无权限访问,404表示请求的资源不存在。
- 5xx 服务端错误类:500表示服务端内部错误,502表示网关错误,503表示服务暂时不可用。
设置HTTP状态码的注意事项
使用header或http_response_code函数之前,绝对不能有任何输出,包括HTML标签、空格、换行、echo输出、var_dump输出等,否则会触发"Cannot modify header information - headers already sent"错误。
如果不确定之前是否有输出,可以使用headers_sent()函数检测头部是否已经发送,该函数的返回值为true表示头部已经发送,无法再设置HTTP状态码:
<?php
if (!headers_sent()) {
// 头部未发送,可以设置状态码
http_response_code(404);
} else {
// 头部已发送,无法设置状态码
echo "HTTP头已经发送,无法设置状态码";
}
?>
另外,设置HTTP状态码之后,如果需要返回对应的响应内容,正常输出即可,状态码的设置不会影响后续内容的输出,但是需要注意输出的内容格式要和前端预期的一致,比如接口场景通常输出JSON格式数据。
<?php
// 接口返回404状态并输出JSON提示
http_response_code(404);
header("Content-type: application/json;charset=utf-8");
$response = [
"code" => 404,
"msg" => "请求的资源不存在",
"data" => null
];
echo json_encode($response, JSON_UNESCAPED_UNICODE);
?>
PHPHTTP状态码header函数http_response_code函数修改时间:2026-06-24 04:54:32