2012-12-16 15 views
10

Nel mio sito Web (in esecuzione con drupal) la funzione ob_flush richiede molto tempo (tra 10 e 100 secondi) per essere eseguita. Come faccio a scoprire perché? Cosa può causare questo così tanto tempo? enter image description hereob_flush richiede molto tempo per essere eseguito

+0

Cosa ti fa pensare che questa funzione blocchi la tua applicazione? – ualinker

+0

@ualinker Vedi l'immagine che ho appena caricato – user16948

+0

Puoi incollare il codice anche con il contesto 'ob_start()' e 'ob_flush()'? – ualinker

risposta

0

uso

<?ob_start();?> 

all'inizio della pagina e

<?ob_flush();?> 

alla fine della pagina, per risolvere questo problema.

0

SET

output_buffering = Off

in php.ini

2

Prova questa:

ob_start(); 
//Your code to generate the output 
$result = ob_get_contents(); //save the contents of output buffer to a string 
ob_end_clean(); 
echo $result; 

E 'gestito veloce per me.

0

[È possibile taggare la domanda con Drupal, poiché sembra che potrebbe trattarsi di un problema di Drupal. In particolare, sospetto che quando svuoti il ​​buffer, stai scrivendo su un buffer esterno, che innesca una tonnellata di hook da chiamare per filtrare i dati appena scritti.]

Sospetto che il tuo problema sia buffer annidati. Drupal ama molto i buffer e fa da buffer a tutto il resto. Controllare il risultato di:

echo "<pre>\nBuffering level: "; 
    . ob_get_level() . 
    . "\nBuffer status:\n" 
    . var_dump(ob_get_status(TRUE)) 
    . "\n</pre>"; 

buffer nidificate Se hai, allora ho il sospetto ob_flush() non farà nulla per voi: solo aggiunge il contenuto del buffer interno nel prossimo strato più esterno della buffering.

I buffer nidificati possono provenire da Drupal stesso (come mostrato sopra), o dalle impostazioni per zlib-output-compression e output_buffering (provare a giocarci, vedere se cambia qualcosa).

Se i tamponi non sono annidati, e le impostazioni di cui sopra non risolve il problema, allora si potrebbe anche voler dividere l'operazione in pezzi, ed eseguire il profiler lì, per vedere quale parte sta prendendo il tempo:

$data = ob_get_contents(); // Return the contents of the output buffer. 
ob_clean(); // Clean (erase) the output buffer. 
ob_end(); // Close the buffer. 
echo($data); // Output our data - only works if there's no outer buffer! 
ob_start(); // Start our buffer again. 

La domanda diventa, quindi, "cosa stai cercando di realizzare?" Cosa pensi che ob_flush() stia facendo qui? Perché se la risposta è "Voglio spingere tutto ciò che ho fatto finora al browser" ... allora temo che ob_flush() non sia la strada giusta.