Salve ho scritto un programmino in php che dovrebbe leggermi dei file con una struttura
specifica del tipo:
codice:
[ITEMDEF ffffff]
DEFNAME=defname
NAME=name
ID=id
TYPE=type
CATEGORY=category
SUBSECTION=subsection
DESCRIPTION=description
Tutti i campi sono opzionali tranne itemdef che fa da chiave primaria.
Devo leggere circa 12000 itemdef ed il mio script ci mette circa 14 secondi, probabilmente
per il forte uso di espressioni regolari.
L'unico modo che ho di sapere che č finita la struttura č l'incontro di un altro itemdef.
Sapreste indicarmi un modo per migliorare le prestazioni di inserimento su db con mysql?
Utilizzo apache+mysql+php aggiornati all'ultima versione.
Ecco il codice:
Codice PHP:
<?php
// Includo il file di configurazione con i parametri.
include("config.inc.php");
// Funzione di conversione del tempo.
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
// Memorizzo l'istante di inizio dello script.
$time_start = microtime_float();
// Connessione al database.
$db = mysql_connect($db_host, $db_user, $db_password);
if ($db == FALSE)
die ("Errore nella connessione. Verificare i parametri nel file config.inc.php");
// Selezione del database.
mysql_select_db($db_name, $db) or die ("Errore nella selezione del database. Verificare i parametri nel file config.inc.php");
// Directory dei files da analizzare.
$dir = "./scripts/";
$itemdef=NULL;
$defname=NULL;
$name=NULL;
$id=NULL;
$type=NULL;
$category=NULL;
$subsection=NULL;
$description=NULL;
// Apro la directory contenente gli scripts.
if ($handle = opendir($dir))
{
// Scorro i vari files contenuti dalla directory.
while (FALSE !== ($file_name = readdir($handle)))
{
// Escludo dalla ricerca "." e "..".
if ($file_name != "." && $file_name != "..")
{
// Apro il file trovato nella directory.
$file = fopen($dir.$file_name, "r") or die("Errore nell'apertura del file $file_name.\n");
// Scorro il suddetto file riga per riga fino a eof.
while(!feof($file))
{
// Scorro le righe del file.
$file_row=ltrim(fgets($file));
// Itemdef.
if(eregi('^\[itemdef ',$file_row))
{
if($itemdef != NULL)
{
// Inserisco le informazioni lette riguardanti l'item precedente nel database.
$query = "INSERT INTO item VALUES ('$itemdef','$defname','$name','$id','$type','$category','$subsection','$description')";
$result=mysql_query($query, $db) or die ("Errore durante l'esecuzione della query.\n");
// Svuoto le variabili per la prossima query.
$defname=NULL;
$name=NULL;
$id=NULL;
$type=NULL;
$category=NULL;
$subsection=NULL;
$description=NULL;
}
// Individuo dove finisce l'id dell'item in questione.
$itemdef_len=strpos($file_row,']');
// Estraggo il valore pulito dell'id dell'item.
$itemdef=trim(strtolower(substr($file_row,9,($itemdef_len - 9))));
}
// Defname.
else if(eregi('^defname=',$file_row))
{
// Estraggo il valore pulito del defname dell'item.
$defname=trim(addslashes(strtolower(substr($file_row,8))));
}
// Name.
else if(eregi('^name=',$file_row))
{
// Estraggo il valore pulito del name dell'item.
$name=trim(addslashes(strtolower(substr($file_row,5))));
}
// Id.
else if(eregi('^id=',$file_row))
{
// Estraggo il valore pulito dell'id dell'item.
$id=trim(addslashes(strtolower(substr($file_row,3))));
}
// Type.
else if(eregi('^type=',$file_row))
{
// Estraggo il valore pulito del type dell'item.
$type=trim(addslashes(strtolower(substr($file_row,5))));
}
// Category.
else if(eregi('^category=',$file_row))
{
// Estraggo il valore pulito della category dell'item.
$category=trim(addslashes(strtolower(substr($file_row,9))));
}
// Subsection.
else if(eregi('^subsection=',$file_row))
{
// Estraggo il valore pulito della subsection dell'item.
$subsection=trim(addslashes(strtolower(substr($file_row,11))));
}
// Description.
else if(eregi('^description=',$file_row))
{
// Estraggo il valore pulito della description dell'item.
$description=trim(addslashes(strtolower(substr($file_row,12))));
}
}
if($itemdef!= NULL)
{
// Chiudo la query del primo o dell'ultimo itemdef lasciata in sospeso.
$query = "INSERT INTO item VALUES ('$itemdef','$defname','$name','$id','$type','$category','$subsection','$description')";
$result=mysql_query($query, $db) or die ("Errore durante l'esecuzione della query.\n");
}
//Azzero gli attributi dell'item.
$itemdef=NULL;
$defname=NULL;
$name=NULL;
$id=NULL;
$type=NULL;
$category=NULL;
$subsection=NULL;
$description=NULL;
// Chiudo il file corrente.
fclose($file);
}
}
// Memorizzo l'istante di fine dello script.
$time_end = microtime_float();
// Calcolo il tempo trascorso per l'esecuzione dello script.
$time_elapsed = $time_end - $time_start;
// Formatto $time_elapsed.
$time_elapsed = number_format($time_elapsed,5,',','.');
// La query č andata a buon fine.
echo "La query ha impiegato $time_elapsed secondi.
";
// Chiudo la connessione al database.
mysql_close($db);
// Chiudo la directory.
closedir($handle);
}
?>