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

时间:2015-05-25 07:33:27

标签: php

通过阅读关于Stack Overflow的php规范和其他问题,我可以看到三种从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。

1 个答案:

答案 0 :(得分:3)

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

  

http_response_code基本上是编写http的简写方式   状态标题,增加了奖金,PHP将合适   通过将您的响应代码与其中一个匹配来提供的原因短语   它所维护的枚举中的值   PHP-SRC /主/ http_status_codes.h。请注意,这意味着您的回复   代码必须与PHP知道的响应代码相匹配。你无法创造   你自己的响应代码使用这种方法,但你可以使用   标题方法。

     

总结 - http_response_codeheader之间的差异   用于设置响应代码:

     
      
  1. 使用http_response_code将导致PHP匹配并从硬编码的原因短语列表中应用原因短语   PHP源代码。

  2.   
  3. 由于上面的第1点,如果您使用http_response_code,则必须设置PHP知道的代码。您无法设置自己的自定义代码,   但是,如果您使用,则可以设置自定义代码(和原因短语)   标题方法。

  4.   

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

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}");
    // ...