2015-05-25 13 views
5

Dalla lettura del spec php e altre domande su Stack Overflow, posso vedere tre modi per inviare un codice di risposta HTTP da PHP:Il modo migliore per inviare il codice di risposta HTTP in 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 

Qual è la differenza tra questi e qual è il migliore da usare? La mia comprensione dei parametri è corretta?

Grazie,

Tugzrida.

risposta

3

per rispondere alla tua domanda su ciò che è la differenza, ho trovato this comment nella documentazione di PHP (grazie Steven):

http_response_code è fondamentalmente un modo veloce di scrivere un colpo di testa di stato http , con il valore aggiunto che PHP risolverà una frase ragionevole di per fornire il codice di risposta corrispondente a uno dei valori in un'enumerazione che mantiene all'interno di php-src/main/http_status_codes.h. Nota che questo significa che il tuo codice di risposta deve corrispondere a un codice di risposta che PHP conosce. Non è possibile creare codici di risposta utilizzando questo metodo, tuttavia è possibile utilizzare il metodo di intestazione .

In sintesi - Le differenze tra http_response_code e header per l'impostazione dei codici di risposta:

  1. Utilizzando http_response_code causerà PHP per abbinare e applicare una Frase Reason da un elenco di frasi Motivo che sono hard-coded in il codice sorgente PHP.

  2. A causa del precedente punto 1, se si utilizza http_response_code è necessario impostare un codice noto a PHP. Non è possibile impostare il proprio codice personalizzato, , tuttavia è possibile impostare un codice personalizzato (e Frase motivo) se si utilizza il metodo di intestazione .


ero curioso di sapere come alcuni quadri popolari inviare l'intestazione in una risposta standard:

Symfony (e Laravel, per eredità) imposta l'intestazione grezzo:

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

Zend Framework 2 imposta anche l'intestazione non elaborata:

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

e così fa Yii

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

Come nota aggiuntiva, ho incontrato uno scenario in IIS/FastCGI dove 'http_response_code' non funziona, ma è ancora possibile impostarlo tramite' header'. –

Problemi correlati