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

Tug*_*ida 5 php

通过阅读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
Run Code Online (Sandbox Code Playgroud)

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

谢谢,

Tugzrida.

Jod*_*ody 3

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

http_response_code基本上是编写 http 状态标头的一种简写方式,额外的好处是 PHP 将通过将响应代码与它在 php-src/main/http_status_codes 中维护的枚举中的一个值相匹配来计算出合适的原因短语来提供。H。请注意,这意味着您的响应代码必须与 PHP 知道的响应代码相匹配。您无法使用此方法创建自己的响应代码,但可以使用标头方法。

http_response_code总结 - 设置响应代码和header 设置响应代码的区别:

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

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


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

Symfony(和Laravel,通过继承)设置原始标头:

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

Zend Framework 2还设置原始标头:

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

亦亦如此

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