2012-08-05 13 views
8

Sto cercando di familiarizzare con la funzione flush() di PHP per un progetto che sto facendo, ho scritto alcuni script personalmente e li ho caricati su qualche spazio web di mia proprietà; ma sembrava che nessuno di loro funzionasse. Ho preso quella qui sotto da un commento sulla PHP.net e l'ho provato:PHP flush() apparentemente funziona sulla mia macchina Linux ma non sulla mia macchina Windows?

<?php 
header('Content-type: text/html; charset=utf-8'); 

echo 'Begin ...<br />'; 
for($i = 0 ; $i < 10 ; $i++) 
{ 
    echo $i . '<br />'; 
    flush(); 
    sleep(1); 
} 
echo 'End ...<br />'; 

A quanto pare lo script ANCORA non funzionava.

Ho poi letto un commento che ha detto:

Se si chiama ob_flush() e flush() e ancora non ottenete il buffer lavata potrebbe essere perché alcuni software antivirus (Panda in questo caso) detiene il buffer fino a quando la pagina non è stata caricata prima di inviarla al browser.

Così ho deciso di richiedere la pagina Web su una macchina che utilizzo Linux (Ubuntu 12.04) in quanto non ha installato alcun software antivirus; e ha funzionato perfettamente!

Non ho idea se questo ha a che fare con il software antivirus? O qualche altro strano meccanismo in Windows che impedisce a flush() di raggiungere lo scopo previsto, sto utilizzando lo stesso browser su entrambe le macchine (Firefox 14.0.1) quindi dubito che possa essere così.

Quindi immagino che la mia vera domanda sia: qualcuno sa qualcosa del software anti-virus che impedisce a flush() di raggiungere il suo scopo prefissato (perché non riesco a trovare nulla a riguardo online)? E se è così, c'è un modo per aggirarlo?

EDIT: Solo per chiarire, sono sicuro che questo NON è lato server, ho un server web esterno che esegue Linux, non sto ospitando questi script localmente su Linux o Windows Machine.

EDIT2: ho provato questo intorno ad una casa di amici sul portatile Linux che sono riuscito a farlo funzionare su a casa mia, stranamente il codice colore, inoltre, non ha funzionato a casa loro (invece solo sono voluti secoli per caricare e tutto è venuto fuori in una volta) il che è strano visto che funziona su questo laptop a casa mia, non sono sicuro che i router abbiano a che fare con la funzione flush() funzionante (non riesco davvero a trovare nulla a riguardo sul web) perché questa è l'unica cosa che posso pensare che potrebbe interferire con esso.

Altrimenti non ho fatto progressi nel tentativo di aggirare questo da solo, questo non ha assolutamente a che fare con il server end, il che è strano dato che la maggior parte delle informazioni che trovo sta parlando del fatto che il server è il problema quando la funzione flush() non funziona:/

Per coincidenza ho provato anche su un PC con Norton (invece di AVG) a casa mia, funzionava ma non del 100%.

risposta

4

Ci sono diverse cose che possono impedire l'uscita dalla visualizzazione immediata, tra cui:

  • buffer dall'interno PHP (che è ciò che flush previene)
  • buffer in modo da accumulare abbastanza dati per comprimere (quando la compressione è abilitata)
  • Buffering sul server Web (potrebbe decidere di farlo per qualsiasi motivo)
  • Buffering all'interno del browser (i browser utilizzano varie tecniche in modo che il caricamento della pagina "si avverti rapidamente" alla fine utente; queste tecniche includono non sempre la visualizzazione di contenuti non appena è disponibile)

Dal flush non può controllare tutto su questa lista, non c'è davvero alcuna garanzia che il vostro programma si comporterà come ci si aspetta che.

Tutto questo è menzionato nelle note per flush:

svuota il buffer di scrittura di PHP e qualunque backend PHP sta usando (CGI, un server web, ecc). Questo tenta di spingere l'output corrente in tutto il modo al browser con alcune avvertenze.

flush() potrebbe non essere in grado di sovrascrivere lo schema di buffering del server Web e non ha alcun effetto su alcun buffer sul lato client nel browser . Inoltre, non influisce sul meccanismo di buffering dell'output userspace di PHP . Ciò significa che dovrai chiamare sia ob_flush() che flush() per svuotare i buffer di uscita ob se li stai utilizzando.

Diversi server, in particolare su Win32, eseguiranno comunque il buffering dell'output dallo script finché non termina prima di trasmettere i risultati al browser.

I moduli server per Apache come mod_gzip possono eseguire il buffering proprio per cui flush() non comporta l'invio immediato dei dati al client da .

Anche il browser potrebbe tamponare il suo ingresso prima di visualizzarlo. Netscape, per esempio, buffer di testo finché esso non riceve un end-of-line o l'inizio di un tag, e non renderà tabelle finché si vede il tag del tavolo esterno.

alcune versioni di Microsoft Internet Explorer sarà solo iniziare a visualizzare la pagina dopo aver ricevuto 256 byte di uscita, in modo da potrebbe essere necessario inviare gli spazi bianchi in più prima di lavaggio per ottenere quei browser per visualizzare la pagina.

+0

So che questo è sicuramente lato client e non lato server, però, la stessa pagina ha funzionato perfettamente quando resa in Firefox in Linux, ma non va bene sotto Windows. Il che mi porta a pensare che anche questo non sia un problema relativo al browser. . . quello sembra eliminare tutte le spiegazioni in quella citazione:/ – Sean

+0

@SeanDunwoody: Come sapete che non è lato server? Il server è un programma diverso sotto ciascun sistema operativo. Lo stesso vale per il browser. – Jon

+0

No, mi dispiace che tu frainteso, ho un server che ospita questo Linux funzionante, non sto ospitando questa localmente su entrambi macchina – Sean

Problemi correlati