2009-09-20 21 views

risposta

13

Nel "caso normale ", non credo ob_start deve essere chiamato prima session_start - né l'altro modo arround.

Citando il manual page of session_start, però:

session_start() registrerà gestore uscita interna per la riscrittura degli URL quando trans-sid è abilitato. Se un utente utilizza ob_gzhandler o come con ob_start(), l'ordine del gestore di output è importante per l'output corretto. Per esempio , l'utente deve registrarsi ob_gzhandler prima dell'inizio della sessione.

Ma questo è una sorta di un caso particolare: la cosa è, qui, che l'ordine dei gestori di uscita è importante: se si vuole un gestore di modificare le cose l'altro ha fatto, devono essere eseguiti in "ordine corretto.


In generale, se non si utilizza questo tipo di gestori (Apache e mod_deflate fare un grande lavoro quando si tratta di compressione di output, per esempio), l'unica cosa che conta è che le intestazioni non devono essere inviato prima di chiamare session_start(perché, a seconda della configurazione, session_start invia i cookie, che vengono passati come intestazioni HTTP).

e le intestazioni vengono inviati non appena una qualsiasi parte dei dati deve essere inviato - vale a dire, non appena c'è una qualsiasi uscita, anche uno spazio bianco al di fuori di <?php ?> tags:

Nota: Se si è utilizzando le sessioni basate sui cookie, è necessario chiamare session_start() prima che tutto sia immesso nel browser.

ob_start indica che PHP ha per bufferizzare dati:

Questa funzione girerà uscita buffering. Mentre il buffer di uscita è attivo, non viene inviata alcuna uscita dallo script (diverso dalle intestazioni), invece l'output è archiviato in un buffer interno .

In questo modo, l'uscita non viene inviato prima che realmente dire, te stesso "inviare i dati". Ciò significa che le intestazioni non vengono inviate immediatamente, il che significa che è possibile chiamare session_start in un secondo momento, anche se ci sarebbe dovuto essere l'output, se non fosse stato utilizzato ob_start.


Spero che questo renda le cose un po 'più chiare ...

5

Se è preimpostato output_buffering è Off e vi sono stati la sfortuna di inviare un singolo byte di dati al client allora le vostre HTTP intestazioni sono già state inviate. Che impedisce efficacemente a session_start() di restituire l'intestazione del cookie al client. Chiamando ob_start() abiliti il ​​buffering e quindi ritardi l'invio delle intestazioni http.

0

session_start potrebbe voler modificare l'intestazione HTTP se sono impostate determinate opzioni di configurazione. Uno per esempio è session.use_cookies che richiede di impostare/modificare il campo Set-Cookie.

La modifica dell'intestazione HTTP richiede che non vi sia alcun output già inviato al client poiché lo HTTP header viene inviato subito prima che venga inviato il primo output.

Così si assicura che non vi sia assolutamente alcuna uscita prima della chiamata di session_start. Oppure si utilizza output buffering control per memorizzare l'output in modo che l'intestazione HTTP possa essere modificata anche se è già presente l'output.

0

session_start() registrerà il gestore di output interno per la riscrittura degli URL quando trans-sid è abilitato. Se un utente utilizza ob_gzhandler o simili con ob_start(), l'ordine del gestore di output è importante per l'output corretto.

Ad esempio, l'utente deve registrare ob_gzhandler prima dell'avvio della sessione.

Ma questa è una specie di caso speciale. Il fatto è, qui, che l'ordine dei gestori di output è importante. Se vuoi che un gestore modifichi le cose che l'altro ha fatto, devono essere eseguite nell'ordine "giusto".

In genere, se non si utilizza quel tipo di gestore (Apache e mod_deflate fanno un ottimo lavoro quando si tratta di comprimere l'output, ad esempio), l'unica cosa che conta è che le intestazioni non devono essere inviate prima di chiamare session_start (perché, a seconda della configurazione, session_start invia i cookie, che vengono passati come intestazioni HTTP).

e le intestazioni vengono inviati non appena una qualsiasi parte dei dati deve essere inviato - vale a dire, non appena c'è una qualsiasi uscita, anche uno spazio bianco al di fuori di <?php ?> tags:

Nota: Se si è utilizzando le sessioni basate sui cookie, è necessario chiamare session_start() prima che tutto venga trasmesso al browser.

ob_start indica che PHP ha per bufferizzare dati:

Questa funzione si accende il buffer di uscita sul. Mentre il buffering dell'output è attivo, nessun output viene inviato dallo script (diverso dalle intestazioni), invece l'output è memorizzato in un buffer interno.

In questo modo, l'output non viene inviato prima di dire, personalmente, "inviare i dati". Ciò significa che le intestazioni non vengono inviate immediatamente, il che significa che session_start può essere chiamato in un secondo momento, anche se avrebbe dovuto essere emesso, se non fosse stato utilizzato ob_start.

0

session_start(); dovrebbe essere chiamato prima che le intestazioni vengano inviate. ob_start() sopprimerà l'output per un po 'e potrai rompere questa regola.Solitamente ob_start() in alto è una soluzione rapida nel caso in cui si esegua il debug di qualcosa di sconosciuto; tutto quanto segue funziona come previsto (non solo come scritto ;-)). Preferisco usare ob_start() in seguito a session_start().