2012-03-15 12 views
5

Ho un oggetto per le attività e su __deconstruct(), è pensato per eseguire alcune delle attività di pulizia più lunghe dopo che il resto della pagina è già stato caricato. Sfortunatamente, buffer l'output e non lo invierà fino a dopo che le attività sono terminate (nulla viene stampato nelle attività).Disabilitazione del buffer di output in PHP

Ho letto attraverso http://www.php.net/flush e ho provato tutti i suggerimenti lì. Ovviamente ho provato a disabilitare output_buffering in php.ini. Ho disabilitato deflate_module, la compressione di zlib è disattivata, non ho mod_gzip. Chiamare flush() o ob_flush() non ha effetto, né abilitare implicit_flush.

Sto eseguendo XAMPP (attualmente apache 2.2.17, php 5.3.4) in Windows Server 2008 R2. PHP viene eseguito come un modulo.

E sì, ho potuto impostare qualche piccola modifica AJAX per eseguire il task manager o anche impostare un'attività programmata per eseguire questa specifica attività, ma il buffering dell'output è stato un problema anche altrove. Vorrei solo che se ne fosse andato a volte.

Da un thread simile, qualcuno ha suggerito vedendo quello seguente farebbe:

<?php 
while (TRUE) 
{ 
    echo 'x'; 
    flush(); 
    sleep(1); 
} 
?> 

Come previsto, la pagina visualizza nulla fino al tempo massimo di esecuzione viene raggiunto, a quel punto svuota il buffer.

Questo è diventato estremamente frustrante. Qualcuno ha qualche idea su cosa potrebbe ancora causarne il buffer?

+0

Puoi confermare che l'output è ancora in fase di buffering rispetto al browser che non visualizza nulla (ad esempio, IE non visualizzerà nulla finché non riceve un numero di byte)? –

+0

fa questa funzione http://php.net/manual/en/function.ob-get-level.php return 0? – dqhendricks

+0

puoi provare questo se aiuta http://in3.php.net/manual/en/function.ob-end-flush.php –

risposta

4

Si sta inviando solo una piccola quantità di dati. I browser hanno il loro buffer, che può essere basato su un numero di byte, da quali elementi sono stati ricevuti, o da qualcos'altro.

In breve, non c'è nulla che tu possa fare al riguardo. Il buffering sta accadendo lato client, non lato server. Potresti provare a inviare più dati prima dei tuoi x s.

È possibile provare questo pacchetto annusando la connessione tra il server e il browser, con Wireshark o simile.

+0

Beh, stavo per dire che stavo mandando un bel po 'di dati prima, ma dopo averlo modificato in for ($ i = 0; $ i <10000; $ i ++) {echo' x
'; sleep (1) }, emette bene. Immagino che l'unica soluzione alternativa sarebbe inviare più dati per forzare il browser a visualizzarli. Potrebbe non essere l'ideale. Grazie comunque. Ho continuato a esaminare le mie sceneggiature e configurazioni e mi stava facendo impazzire. – Apropos

+0

IE è noto per questo. Ho ingannato IE inviando circa 1000 spazi prima del lavaggio. Poiché l'HTML confonde gli spazi, non ha importanza. – nalply

4

hmmm, interessante afferrato un elemento di cattura del codice che ho utilizzato altrove e funziona come previsto ...

https://stackoverflow.com/a/9728519/632951 

<?php 
echo str_repeat('fillerbytes',20*1024/strlen('fillerbytes')); 
echo '<body style="font-size:6px;font-family:arial;">'; 
echo str_repeat('<br>',2); 
    for($i=1; $i<=5000; $i++){ 
     echo $i . ' '; 
     ob_flush(); 
     flush(); 
     usleep(2000); // 2 ms each = 10s total 
    } 
?> 

guardare il mio numero di server a 5000 http://atwebresults.com/texttest/new.php

(Non funziona su alcuni host gratuiti come freehostingeu.com)

+0

Sì, questo funziona. Sfortunatamente, è solo perché sta inviando molti più dati di quelli che volevo inviare. La modifica del tempo tra le iterazioni su 1 anziché su .001 provoca il ritorno del comportamento indesiderato. – Apropos

+0

Questa è la mia giornata. Penso che funzioni a causa dell'uso di ob_flush(); invece di flush(); – Alrik

+0

È a causa della quantità di dati inviati, non di ob_flush(). L'esempio originale fallisce anche quando si aggiunge ob_flush(), o questo fallisce quando si cambia il tempo tra le iterazioni in 1s invece di un millesimo di secondo come è attualmente. – Apropos

Problemi correlati