Newsgroup: it.comp.www.php
Titolo: [SPECIALE GURU] ob_flush()

Queste sono domande che credo farebbe molto piu' piacere vedere, invece
delle solite :-)
Premetto che ho gia' acceso i bastoncini di incenso rituali, prima di
rivolgermi ai guru.
Quand'e' che ob_start() e ob_flush() rendono piu' veloce la
visualizzazione di una pagina? E di quanto?
Se ho una struttura tipo
<? query database ?>
HEADER HTML/CSS
<? include menu ?>
<? include altro pezzo ?>
ALTRO HTML
<? visualizzazione database ?>
ALTRO HTML
<? include footer ?>
che genera una ventina di kb, devo inserire i pezzi di HTML in comandi
echo per ottimizzare l'ob_flsuh()?
Se mi basta un solo ob_flush() a fine pagina, converrebbe a quel punto
usare ob_end_flush() che svuota anche il buffer?
Mi prostro fiducioso nell'attesa dell'illuminazione...
Marco
-- 
bernama -lumachina- libero -PUNTO- it
Mi sono lasciato crescere la barba perche' spero che O'Reilly,
visto che non mi stampa un manuale, almeno mi dedichi una copertina.
M.B.
+- PHPRndSig 0.02 ---------------------------------------------9/67-+

 visualizzazione di una pagina? E di quanto?
Perchè l'output buffering velocizza l'esecuzione dello script ? Io credevo che 
l'unica "velocizzazione" fosse data dal poter aggiungere:
header('Content-Length: '.ob_get_length());
prima di ob_end_flush() (Permette al browser d effettuare connessioni HTTP/1.1 
persistenti)
-- 
Lorenzo

usare ob_end_flush() che svuota anche il buffer?
Si'. Oppure nulla :-)
Leonardo

 essere veramente utile ob_gzhandler.
Quindi se io, come mia abitudine, accodo tutta la pagina ad una sola
variabile con una serie di $pagina .= qualcosa e poi faccio un solo
<?=$pagina?>, a quel punto ho un vantaggio praticamente nullo. O no?
ciao
Marco
-- 
bernama -coda di porchetto- libero -puntino- it
/* Fscking Microsoft marketing department. Their "32" is 28. */
(Linux Kernel 2-4-19, /fs/fat/cache.c)
+- PHPRndSig 0.02 --------------------------------------------42/67-+

<?=$pagina?>, a quel punto ho un vantaggio praticamente nullo. O no?
A meno di usare gzhandler, si', hai un vantaggio praticamente nullo.
Leonardo
-- 
Time's angles, mages tell, conceal a place
incredible, beyond the mundane mind;
night-shrouded and between the seas of space
dread creatures drift in the ageless winds.

 visualizzazione di una pagina? E di quanto?
prima cosa... non avanzo la pretesa di essere un guru..  :)
In certi casi comunque (quei casi in cui hai parecchi echo..) l'incremento
di prestazioni a me pare notevole...
Puoi verificare tu stesso...
<?php
function getmicrotime(){
 static $var_controllo = 0;
 static $tempo1;
 if ($var_controllo == 0) {
  list($usec, $sec) = explode(" ",microtime());
  $tempo1 = (float)$usec + (float)$sec;
  $var_controllo = 1;
 } else if ($var_controllo == 1) {
  list($usec, $sec) = explode(" ",microtime());
  $tempo2 = (float)$usec + (float)$sec;
  $tempo_esecuzione = $tempo2 - $tempo1;
  $var_controllo = 0;
  return $tempo_esecuzione;
 }
}
getmicrotime();
ob_start();
for ($i=0;$i<10000;$i++) {
 echo "ciao\n";
}
echo getmicrotime();
ob_end_flush();
?>
<?php
function getmicrotime(){
 static $var_controllo = 0;
 static $tempo1;
 if ($var_controllo == 0) {
  list($usec, $sec) = explode(" ",microtime());
  $tempo1 = (float)$usec + (float)$sec;
  $var_controllo = 1;
 } else if ($var_controllo == 1) {
  list($usec, $sec) = explode(" ",microtime());
  $tempo2 = (float)$usec + (float)$sec;
  $tempo_esecuzione = $tempo2 - $tempo1;
  $var_controllo = 0;
  return $tempo_esecuzione;
 }
}
getmicrotime();
for ($i=0;$i<10000;$i++) {
 echo "ciao\n";
}
echo getmicrotime();
?>

 strabestia, non ho mai ottenuto piu' di un 5% a spingere.
Ho fatto alcuni esperimenti in locale con ob_start() ed ho visto che la
differenza di velocita' non e' notevole, neppure con 10000 righe
intabellate.
Questo e' lo script base:
<?
# ob_start("ob_gzhandler");
echo "<table border=1 cellspacing=0 cellpadding=4>\n"; 
$data1 = time();
for ($i=0; $i<=10000; $i++) {
    echo "<tr><td align=right>$i</td></tr>\n";
}
$data2 = time();
$tempo = $data2 - $data1;
echo "</table><hr>$tempo";
?>
L'ob_start() e' commentato per essere attivato in seguito. 
In uno script successivo ho sostituito gli echo con $pagina .= e poi ho 
visualizzato $pagina alla fine.
Questi sono i risultati in secondi (tempo browser/tempo visualizzato in
pagina):
         Mozilla     Opera
niente    14 / 3     2 / 0
ob_start  14 / 0     2 / 0
ob_gz     12 / 0     2 / 0
variab.   14 / 1     2 / 0
Fissando la larghezza della tabella con un CSS (style="width: 150") la
velocita' di visualizzazione e' scesa a 11.7: a questo punto credo
convenga dedicare maggior cura all'ottimizzazione dell'HTML che non del
PHP.
ciao
Marco
-- 
bernama -ricciolo- libero -- it
E se Dio avesse creato l'Uomo solo come
nutrimento per le zanzare?
M.B.
+- PHPRndSig 0.02 --------------------------------------------18/67-+

 Puoi verificare tu stesso...
Mi sa che i nostri post si sono incrociat...
Si, in effetti, calcolando esattamente i microsecondi, la differenza
percentuale non e' indifferente.
Pero', ai fini pratici, 0.015 secondi non mi pare distinguibile da 0.075
secondi, se poi il browser ce ne mette altri 10 a generare una tabella
(non parliamo di quando serve anche un'immagine!).
Penso comunque di aver trovato almeno un'applicazione utile per queste
velocita'.
Avendo un database di qualche centinaio di record, che viene normalmente
visualizzato in pagine di 10 record, ho intenzione di passarlo in un unico
blocco grezzo ai soli motori di ricerca, altrimenti sarebbe problematico
farlo indicizzare.
La soluzione mi permettera' di tenere meno impegnata la linea (manco fosse
playboy.com
!).
ciao
Marco
-- 
bernama -coda di porchetto- libero -.- it


 Pero', ai fini pratici, 0.015 secondi non mi pare distinguibile da 0.075
Beh.. questo è vero se devi far girare lo script in locale dove magari hai
l'ultimo modello di pc o non devi prestare molta attenzione alla
portabilità.
Se devi andare in hosting, dove generalmente non è che ci siano delle
schegge, la cosa può cambiare: se si passa da 5 secondi a 1 si nota
eccome...
D'accordo con te che poi non debba essere l'unica cosa da ottimizzare.

intabellate.
Attenzione, la formula e':
	TempoDisplay	= TempoGenerazione
			+ TempoBuffering
			+ TempoConnessione
			+ TempoTrasmissione
			+ TempoRendering;
TempoGenerazione:	riducibile migliorando l'algoritmo
			riducibile accelerando PHP
				(Macchina piu' potente, piu' RAM,
				 Zend Encoder, PHP Accelerator...)
TempoBuffering:		riducibile con ob_*, aumentando la RAM, ed
			intervenendo sul kernel (Linux)
TempoTrasmissione:	dipende dalla linea. Riducibile con gzhandler,
			con caching degli oggetti statici, con uso ove
			possibile di DHTML
TempoRendering:		dipende dalla complessita' dell'HTML, e da quali
			necessita' di rendering si prospettano.
			Riducibile fornendo al browser piu' informazioni
			(column & image width & height, content-length e
			cosi' via)
			Browser diversi avranno tempi diversi
In locale, TempoTrasmissione e' talmente breve che non apprezzeresti una
riduzione anche del 50%, mentre il TempoRendering domina tutto.
Leonardo Amdahl


 			+ TempoRendering;
+ numero di utenti che si stanno scaricando film porno in quel momento,
+ utenti deficienti che cliccano ovunque ci sia scritto clicca qui,
+ modem che non sorpassano mai i 49k...
Diciamo pure che per noi poveri mortali se una pagina arriva in 20
secondi va gia' bene!
ciao
Marco
-- 
bernama -pirolino- libero -- it
In C i bug vanno scritti. In C++ si possono ereditare.
+- PHPRndSig 0.02 --------------------------------------------62/67-+