当我在Azure (php7.4或8.0)上运行以下代码时:
<?php
try {
throw new Exception('x');
}catch (Exception $e) {
echo '1 '; // If i comment this line, http status code will be 400...
http_response_code(400);
}
echo '3 ';
echo http_response_code();
结果是“13400”,但是当我检查我的http状态代码时,我的200 (在几个浏览器上相同)。
当注释行回显'1‘时,http状态代码变为400。
从我的观点来看,I总是期望400,因为http状态代码会导致此代码.
发布于 2022-01-28 14:23:14
设置响应代码意味着设置响应头。只有当没有输出发送到客户端时,才能设置这些标头。
要检查,如果可以添加更多的http头,则可以使用函数headers_sent
。
在你的例子中:
try {
throw new Exception('x');
} catch (Exception $e) {
echo '1 '; // If i comment this line, http status code will be 400...
if(headers_sent()) { //check if headers were sent already
print 'oops, headers have been sent already, not possible to add some more :-(';
}
http_response_code(400);
}
echo '3 ';
echo http_response_code();
在某些服务器上,在报头最终被发送之前,可以回显少量的输出。这是因为已经配置了一定大小的输出缓存。(使用output_buffering
设置)因此,很可能在服务器上将此设置设置为0。然后,头已经与输出的第一个字节一起发送,即使它是不可见的。
更多信息可以在一个关于发送头和输出的老问题中找到:https://stackoverflow.com/a/8028987
发布于 2022-02-01 08:51:02
在阅读了Akrys的答案之后,我明白这个例外与它无关。
一个更好的问题是:
为什么下面的代码返回http状态代码200?
echo 'A';
http_response_code(400);
以及为什么下面的代码返回http状态代码400?
当您回答“在某些服务器上,在报头最终发送之前,有可能回显少量的输出。”
http_response_code(400);
echo 'A';
这取决于output_buffering
设置,这解释了为什么我在本地php服务器上总是有一个http状态代码400 .
谢谢你的回答..。
https://stackoverflow.com/questions/70900496
复制