- Home
- Categorie
- Coding e Sistemistica
- PHP
- Esportazione DB, consigli su ottimizzazione codice sorgente
-
Esportazione DB, consigli su ottimizzazione codice sorgente
Salve a tutti, ho scritto una classe php che esporta la struttura e i dati di un DB in un file .sql.
La classe in questione utilizza l'information schema quindi non funziona con DB che non lo supportano.
Da notare che la classe in questione utilizza un altra classe per eseguire effettivamente le query al DB, non richiede parametri ma l' ho scritta per un mio DB in cui mi servivano solo le tabelle che iniziavano con zz_NOMETABELLA.
Posto il codice, volevo sapere dagli esperti come può essere ottimizzato,se sarebbe meglio cambiare logica lasciando stare l'information schema, se a livelli di tempi di esecuzione, considerando eventualmente DB di grosse dimensioni risulterebbe lento e macchinoso e via dicendo, insomma pareri e consigli...<?php class cDB_Export{ var $file_content=null; function __construct(){ $tot_tables = $this->sel_count(); $val_tables = $this->sel_name(); for($b = 0; $b<$tot_tables[0]['tot']; $b++){ $structure_table = $this->get_StructureTable($val_tables**["TABLE_NAME"]); $this->CreateTable_query($structure_table,$val_tables**["TABLE_NAME"]); $this->file_content .= "\n"; $this->CreateInsert_query($structure_table,$val_tables**["TABLE_NAME"]); $this->file_content .= "\n\n"; $this->file_content .= "----------------------------------------------------------------------------------------------------\n\n"; } $this->save_on_file(); $this->create_zip_file(); echo "operazione terminata"; } function __destruct(){} public function __get($valore){ return $this->value[$valore]; } public function __set($attributo, $valore){ /*$ut = new scUtility(); $ut->str = $valore; $this->value[$attributo] = $ut->check_input();*/ } //FIRST STEP - get table structure private function get_StructureTable($tbl_name){ $conn = new scConnect(); $conn->stampa = false; $conn->query = " DESCRIBE " . $tbl_name . " "; $conn->descrizione = "describe table"; $val = $conn->select(); unset($conn); return $val; } //SECOND STEP - "create the 'create query'" private function CreateTable_query($tbl_structure,$tbl_name){ $create_query = "DROP TABLE IF EXISTS `" . $tbl_name . "`; CREATE TABLE IF NOT EXISTS `" . $tbl_name . "` (\n"; for($i=0; $i<count($tbl_structure); $i++){ if(($tbl_structure*['Null'] == "no") || ($tbl_structure*['Null'] == "NO")){ $create_query .= "`" . $tbl_structure*['Field'] . "` " . $tbl_structure*['Type'] . " NOT NULL "; }else{ $create_query .= "`" . $tbl_structure*['Field'] . "` " . $tbl_structure*['Type'] . " DEFAULT NULL " ; } if(($tbl_structure*['Key'] == "pri") || ($tbl_structure*['Key'] == "PRI")) $create_query .= " PRIMARY KEY " . $tbl_structure*['Extra']; if($i < count($tbl_structure)-1) $create_query .= ","; $create_query .= "\n"; } $create_query .= ") ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;"; $this->file_content .= $create_query; } //THIRD STEP - create the insert query of the values private function CreateInsert_query($tbl_structure,$tbl_name){ $conn = new scConnect(); $conn->stampa = false; $insert_query = ""; $conn->query = "SELECT COUNT(*) AS tot FROM " . $tbl_name; $conn->descrizione = "SELECT COUNT"; $val_tot = $conn->select(); $conn->query = "SELECT * FROM " . $tbl_name; $conn->descrizione = "SELECT *"; $val = $conn->select(); for($ii=0; $ii<$val_tot[0]['tot']; $ii++){ $appoggio_query = "INSERT INTO " . $tbl_name . "("; for($i=0; $i<count($tbl_structure); $i++){ $appoggio_query .= " " . $tbl_structure*['Field'] ; if($i < count($tbl_structure)-1) $appoggio_query .= ","; else $appoggio_query .= ") VALUES ( "; } for($a=0; $a<count($tbl_structure); $a++){ $appoggio_query .= "'" . $val[$ii][$a] . "'"; if($a < count($tbl_structure)-1) $appoggio_query .= ","; else $appoggio_query .= ")"; } $insert_query .= $appoggio_query . "\n\n"; } $this->file_content .= $insert_query; unset($conn); } private function save_on_file(){ $myFile = $this->today_date() . "_BACKUP_DB.sql"; $fh = fopen($myFile, 'w') or die("can't open file"); fwrite($fh, $this->file_content); fclose($fh); } private function sel_count(){ $conn = new scConnect(); $conn->stampa = false; $conn->query = "SELECT COUNT(*) AS tot FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'zz_%'"; $conn->descrizione = "select tot elenco table"; return $conn->select(); } private function sel_name(){ $conn = new scConnect(); $conn->stampa = false; $conn->query = "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'zz_%'"; $conn->descrizione = "select elenco table"; return $conn->select(); } private function create_zip_file(){ $data = $this->today_date(); $backupFile = $data . "_BACKUP_DB.zip"; //Se esiste già, lo cancello if (file_exists($backupFile)) @unlink($backupFile); $archive = new PclZip($backupFile); //Una lista di nomi di files da comprimere $listOfFilesToCompress = $data . "_BACKUP_DB.sql"; //Aggiungo i files all'archivio $v_list = $archive->add($listOfFilesToCompress); if ($v_list == 0) { die("Error : ".$archive->errorInfo(true)); } unlink($listOfFilesToCompress); } private function today_date(){ $data = date ("d/m/Y"); $appoggio = split("/", $data); return $appoggio[0] . "" . $appoggio[1] . "" . $appoggio[2]; } } ?>