2015-05-25 19 views
5

Czytając specyfikację PHP i inne pytania na przepełnienie stosu, widzę trzy sposoby wysyłając kod odpowiedzi HTTP z PHP:Najlepszy sposób wysyłania HTTP kod odpowiedzi w PHP

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 

Jaka jest różnica między te i który z nich jest najlepszy w użyciu? Czy moje zrozumienie parametrów jest poprawne?

Dzięki,

Tugzrida.

Odpowiedz

3

Aby odpowiedzieć na pytanie o to, co jest różnica, znalazłem this comment w docs PHP (dzięki Steven):

http_response_code jest po prostu skrótem sposób pisania nagłówek stanu http , z dodatkowym bonusem że PHP opracuje odpowiednie zdanie przyczyny , aby zapewnić dopasowanie kodu odpowiedzi do jednej z wartości w wyliczeniu, które zachowuje w obrębie php-src/main/http_status_codes.h. Zauważ, że oznacza to, że twój kod odpowiedzi musi być zgodny z kodem odpowiedzi, o którym wie PHP. Nie można utworzyć własnych kodów odpowiedzi za pomocą tej metody, jednak można użyć metody nagłówkowej .

Podsumowując - Różnice między http_response_code i header do ustawiania kodów odpowiedzi:

  1. Korzystanie http_response_code spowoduje PHP aby dopasować i zastosować frazę Reason z listy fraz powodu, że są zakodowane w kodu źródłowego PHP.

  2. Z uwagi na powyższy punkt 1, jeśli używasz http_response_code musisz ustawić kod, o którym wie. Nie można ustawić własnego niestandardowego kodu, , ale można ustawić niestandardowy kod (i wyrażenie przyczyny), jeśli używana jest metoda nagłówka .


byłem ciekaw jak niektóre popularne ramy wysłać nagłówek w standardowej odpowiedzi:

Symfony (i Laravel, przez dziedziczenie) ustawia surowego nagłówka:

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

Zend Framework 2 ustawia także nagłówek wiersza:

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

I tak robi Yii

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

Jako dodatkowe noty, jakie napotkał scenariusz pod IIS/FastCGI gdzie 'http_response_code' nie działa, ale nadal można ustawić poprzez' header'. –

Powiązane problemy