Newsgroup: it.comp.www.php
Titolo: immagini su file e db a confronto (già gd, db ...)

Ho eseguito, per la gioia di molti, un primo test sui tempi di acquisizione 
delle immagini da parte del browser per mettere a confronto l'uso del fs e 
l'uso del db nella gestione delle immagini.
sono state usate 2 tabelle su db (mySQL):
create table pippo (id integer primary key auto_increment, campoblob blob);
per la gestione delle immagini come blob nel db
create table pluto (id integer primary key auto_increment, path 
varchar(80));
per la gestione delle immagini su fs.
queste due tabelle sono state popolate allo stesso modo con le stesse 720 
immagini (o link ad immagini) tutte diverse tra di loro e mediamente grandi 
1250 bytes.
in entrambi i casi, il test consisteva nella creazione dinamica (tramite 
fetch delle tabelle) di una pagina html contenente 1 tabella da 6 colonne e 
120 righe e, per ogni cella, un'immagine.
nel caso del db, i tag per le immagini erano <img src='get.php?id=$id'>
lo script get.php provvede ad estrarre da db lo stream dell'immagine ed a 
passarlo al browser con una normale print (con l'header settato 
opportunamente)
nel caso del fs invece, <img src='nomefile.jpg'> in quanto può venire 
selezionato direttamente il path dalla tabella pluto.
------------------
#ecco lo script showfile.php che fa caricare al browser i files da fs:
$conn = mysql_connect( $db_host, $db_user, $db_pass)
	or die ("Impossibile connettersi");
mysql_select_db( $db_name, $conn)
	or die ("Impossibile selezionare il database $db_name");
$sql="select path from pluto";
$result=mysql_query($sql,$conn);
$count=0;
print "<table width=100% bgcolor=#000000 celpadding=1>";
while($riga=mysql_fetch_row($result))
	{
	if($count==6)
		{
		print "</tr>";
		$count=0;
		}
	if($count==0)
		{
		print "<tr bgcolor=#ffffff>";
		}
	print "<td align=center><img src='".$riga[0]."'></td>";
	$count++;
	}
for($i=$count;$i<6;$i++)
	print"<td>&nbsp</td>";
print "</tr></table>";
-------------------
#e quello, molto simile, che li fa caricare da db:
$conn = mysql_connect( $db_host, $db_user, $db_pass)
	or die ("Impossibile connettersi");
mysql_select_db( $db_name, $conn)
	or die ("Impossibile selezionare il database $db_name");
$sql="select id from pluto";
$result=mysql_query($sql,$conn);
$count=0;
print "<table width=100% bgcolor=#000000 celpadding=1>";
while($riga=mysql_fetch_row($result))
	{
	if($count==6)
		{
		print "</tr>";
		$count=0;
		}
	if($count==0)
		{
		print "<tr bgcolor=#ffffff>";
		}
	print "<td align=center><img src='get.php?id=".$riga[0]."'></td>";
	$count++;
	}
for($i=$count;$i<6;$i++)
	print"<td>&nbsp</td>";
print "</tr></table>";
-------------------
# e lo script che ritorna lo stream da db a browser:
header ("Content-type: image/jpeg");
$conn = mysql_connect( $db_host, $db_user, $db_pass)
	or die ("Impossibile connettersi");
mysql_select_db( $db_name, $conn)
	or die ("Impossibile selezionare il database $db_name");
$sql="select campoblob from pippo where id=$id";
$result=mysql_query($sql,$conn);
$riga=mysql_fetch_row($result);
print $riga[0];
mysql_close($conn);
nel caso di caricamento fa file (il browser richiede al server direttamente 
i files di immagine), il browser ha terminato di caricare la pagina in 18 
secondi circa.
nel caso di caricamento da db (il browser richiama get.php che si collega 
al db, preleva il blob e lo ritorna), il caricamento di tutti gli oggetti 
ha richiesto ben 36 secondi...
quindi, il rapporto di velocità è stato di 2 a 1 a favore della gestione su 
fs, nonostante l'indice creato sulla tabella pippo.
la generazione dell'html, invece, è stata a favore della gestione su db, in 
quanto viene effettuata una select su un integer (id) piuttosto che su un 
varchar (path). si tratta però di poco più di un secondo contro 3...
per questo test è stato utilizzato:
windows nt 4.0 sp5
mysql 3.23.34
php 4.0.5rc1
apache 1.3.19
internet explorer 5.5
sarebbe da vedere la release 4.0 di mySQL che a quanto pare velocizza di 
molto le prestazioni su blob...
... e magari provare con configurazioni / browsers differenti.
se vi sembra che abbia commesso leggerezze nel test, fatemi sapere!
saluti a tutti!


Prova a usare random access, magari popolando il db/fs con 10000 file e fare
richieste random di alcuni file solo. Misurando non solo il tempo che
impiega il browser ma anche quanto tempo ci mette lo script (perche' il
browser fa qualche caching, e quindi i risultati non sono puliti).
Per complicare al browser la vita basta anche aggiungere ai link/file da
caricare un parametro che non viene utilizzato [tipo
"?id=".rand()."&altroValore=".time() ]...
per il resto: :-)
Se metti il tutto (script per la popolazione) in qualche zip scaricabile da
qualche parte lo provo su altre macchine...
Jurgen

 scaricabile da qualche parte lo provo su altre macchine...
oggi non faccio in tempo.
domani magari trovo un ritaglio di tempo per fare queste prove!
ciao

> per quanto riguarda i 10000 files... beh... li devo trovare!
for ($i=0; $i < 10000; $i++)
    copy("org.gif", $i.".gif");
;-)