2013-03-10 14 views
6

Ho uno script che funziona per 1 ora. Ho 2 webhosts, in uno di questi, posso vedere l'output in tempo reale, (fa un loop di un milione di volte ed echeggia roba) mentre sull'altro webhost, devo aspettare che lo script finisca di funzionare prima di vedere qualsiasi output affatto.Visualizzazione continua dell'uscita PHP?

Come posso modificare le impostazioni per mostrare l'uscita in tempo reale? Immagino che questa sia una cosa php.ini.

Aggiunta codice: questo codice verrà emesso durante l'esecuzione nel primo server, ma non nel secondo server. Informazioni aggiuntive, se inserisco il valore di 1015 in basso, il primo server attende con l'emissione. Quindi sembra che il mio primo server stia scaricando ogni 1015 caratteri, mentre il secondo no.

while ($a++ < 5) { 
    $b = 0; 
    while ($b++ < 1015) { 
    echo "H"; 
    } 
    echo "<br><br>\n"; 
    sleep(1); 
} 

Sul mio secondo server, il buffering è spento, e ho provato accendendo implicit_flush inutilmente.

risposta

2

Prova a chiamare flush periodicamente. Se si utilizza output buffering, è possibile disattivarlo con una sequenza di ob_end_flush oppure utilizzare ob_flush.

+0

niente ha funzionato sul mio secondo server. Immagino che il server stia ignorando alcune impostazioni. –

6

Questo è correlato al buffer di uscita. Se il buffer di output è attivato, l'output non viene inviato al client immediatamente, ma attenderà fino a quando una certa quantità di dati verrà memorizzata nel buffer. Questo di solito aumenta le prestazioni ma causerà problemi come il tuo.

La soluzione più semplice non richiede di modificare qualsiasi php.ini impostazioni, ma in poche parole questo all'inizio dello script:

<?php 
    while (@ob_end_flush()); 
?> 

Questo filo e disattivare tutti i buffer di uscita in una volta.

(Fonte: http://www.php.net/manual/en/function.ob-end-flush.php#example-460)

Potreste anche voler leggere il manuale di PHP su Output Control. Le relative impostazioni php.ini sono elencate here.

Se si desidera assicurarsi che le cose vengano inviate (vale a dire prima di un'attività che richiede tempo), chiamare flush() nei momenti appropriati.


Edit:

Nei browser fatto può avere i propri buffer, specialmente quando Content-Type non è impostato in modo esplicito (il browser ha bisogno di annusare il tipo MIME del file). Se questo è il caso, non puoi controllare il comportamento del browser.

Un modo che potrebbe risolvere è quello di impostare in modo esplicito il Content-Type:

header("Content-Type: text/plain"); // if you don't need HTML 
// OR 
header("Content-Type: text/html"); 

Ma questo non è garantito il funzionamento. Funziona sul mio Firefox ma non su Chrome.

In ogni caso, il codice finale dovrebbe essere simile:

header("Content-Type: text/html"); // Set Content-Type 
while (@ob_end_flush()); // Flush and disable output buffers 
while ($a++ < 5) { 
    $b = 0; 
    while ($b++ < 1015) { 
    echo "H"; 
    //flush(); // In fact because there is no significant delay, you should not flush here. 
    } 
    echo "<br><br>\n"; 
    flush(); // Flush output 
    sleep(1); 
} 
+0

indovina ho bisogno del php.roba ini, lo svuotamento non ha fatto nulla per me su quel server. –

+0

@KristianRafteseth I browser Web possono anche avere il proprio buffering, quindi questo potrebbe non essere sempre un problema lato server. –

+0

ma sto usando lo stesso script, e la stessa sessione nello stesso browser ed eseguo entrambi gli script contemporaneamente, sui diversi server. e uno visualizza l'output subito, l'altro non lo fa. –

Problemi correlati