在PHP中发送HTTP响应代码的最佳方式

前端之家收集整理的这篇文章主要介绍了在PHP中发送HTTP响应代码的最佳方式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
通过阅读 PHP规范和Stack Overflow上的其他问题,我可以看到三种从PHP发送HTTP响应代码方法
header("HTTP/1.0 404 Not Found");
           ^      ^     ^
           A      B     C

header(" ",false,404);
        ^     ^     ^
        C     D     B

http_response_code(404);
                    ^
                    B

A: Defines HTTP header
B: Response code
C: Message
D: To replace prevIoUs header or not

这些和最好使用哪一个有什么区别?我对参数的理解是否正确?

谢谢,

Tugzrida.

为了回答你关于有什么区别的问题,我在PHP文档中找到了 this comment(感谢Steven):

http_response_code is basically a shorthand way of writing a http
status header,with the added bonus that PHP will work out a suitable
Reason Phrase to provide by matching your response code to one of the
values in an enumeration it maintains within
PHP-src/main/http_status_codes.h. Note that this means your response
code must match a response code that PHP knows about. You can’t create
your own response codes using this method,however you can using the
header method.

In summary – The differences between http_response_code and header
for setting response codes:

  1. Using http_response_code will cause PHP to match and apply a Reason Phrase from a list of Reason Phrases that are hard-coded into
    the PHP source code.

  2. Because of point 1 above,if you use http_response_code you must set a code that PHP knows about. You can’t set your own custom code,
    however you can set a custom code (and Reason Phrase) if you use the
    header method.

我很好奇一些流行的框架如何在标准响应中发送标头:

Symfony(和Laravel,继承)设置原始标题

// status
header(sprintf('HTTP/%s %s %s',$this->version,$this->statusCode,$this->statusText),true,$this->statusCode);

Zend Framework 2还设置了原始标题

public function renderStatusLine()
{
    $status = sprintf(
        'HTTP/%s %d %s',$this->getVersion(),$this->getStatusCode(),$this->getReasonPhrase()
    );
    return trim($status);
}

Yii也是如此

protected function sendHeaders()
{
    if (headers_sent()) {
        return;
    }
    $statusCode = $this->getStatusCode();
    header("HTTP/{$this->version} $statusCode {$this->statusText}");
    // ...

猜你在找的PHP相关文章