Szukam skryptu PHP który:
1. wypakuje z serwera plik *.gz (gzip)
2. wypakowany plik w formacie csv zaimportuje do bazy mysql
3. skrypt podczas importu bedzie odporny na time_limit
4. musi działać szybko (szybko importować dane)
4. mile widziany jakiś pasek postępu w czasie pracy...
No dobra napisałem coś swojego na własny użytek. Skrypt jest przytosowany raczej do moich szczególnych potrzeb ale po drobnych poprawkach może być do ogólnego zastosowania również, kodzik umieszczam dla potomnych, może się komuś przyda...
Konfiguracja: wszystko w pliku config.inc.php
Wywołanie: import.php
Struktura importowanego pliku csv: każde pojedyńcze słowo w osobnej linijce
Struktura mysql:
DROP TABLE IF EXISTS `slownik_pl`; CREATE TABLE IF NOT EXISTS `slownik_pl` ( `slowo` varchar(45) character SET latin2 collate latin2_bin NOT NULL DEFAULT '', PRIMARY KEY (`slowo`) ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
config.inc.php
<?php // ustawienia dla serwera //error_reporting(4095); // ustawienia dla mysql'a $sql_serwer = "localhost:3306"; $sql_user = ""; $sql_password = ""; $sql_baza = ""; $sql_tabela = ""; // ustawienia dla kodowania $kodowanie1="latin2"; //utf-8 $kodowanie2="latin2_general_ci"; //utf_polish_ci // plik do zaimportowania $plik = ("slownik_pl.csv"); // ustawienia skryptu $czy_usunac = 1; // czy mam wyczyscic tabele przed importem (1-tak, 0-nie) $czy_posortowac = 0; // czy po zaimportowaniu baza ma zostać posortowana alfabetycznie, moze to trwać b rdzo dlugo (1 -tak, 0, nie, domyslnie 0) $czy_indeksowac = 1; // moze trwac dlugo (1-tak, 0-nie) $konwersja = 0; //0-brak, 1-z ISO-8859-2 na UTF-8, 2-z UTF-8 na ISO-8859-2 $rekordow = 0; // ma być zawsze 0 /* $funkcja_iconv = false; // ma być zawsze 0 if (function_exists('iconv')) { $funkcja_iconv = true; } else { $funkcja_iconv = false; } */ ?>
funkcje.inc.php
<?php function win2utf(){ "xb9" => "xc4x85", "xa5" => "xc4x84", "xe6" => "xc4x87", "xc6" => "xc4x86", "xea" => "xc4x99", "xca" => "xc4x98", "xb3" => "xc5x82", "xa3" => "xc5x81", "xf3" => "xc3xb3", "xD3" => "xc3x93", "x9c" => "xc5x9b", "x8c" => "xc5x9a", "x9f" => "xc5xbc", "xaf" => "xc5xbb", "xbf" => "xc5xba", "xac" => "xc5xb9", "xf1" => "xc5x84", "xD1" => "xc5x83"); return $tabela; } function iso2utf(){ "xb1" => "xc4x85", "xa1" => "xc4x84", "xe6" => "xc4x87", "xc6" => "xc4x86", "xea" => "xc4x99", "xca" => "xc4x98", "xb3" => "xc5x82", "xa3" => "xc5x81", "xf3" => "xc3xb3", "xD3" => "xc3x93", "xb6" => "xc5x9b", "xa6" => "xc5x9a", "xbc" => "xc5xbc", "xac" => "xc5xbb", "xbf" => "xc5xba", "xaf" => "xc5xb9", "xf1" => "xc5x84", "xD1" => "xc5x83"); return $tabela; } function ISO88592_2_UTF8($tekst){ } function UTF8_2_ISO88592($tekst){ } function WIN1250_2_UTF8($tekst){ } function UTF8_2_WIN1250($tekst){ } function ISO88592_2_WIN1250($tekst){ } function WIN1250_2_ISO88592($tekst){ } ?> <?php /* echo WIN1250_2_ISO88592('ten tekst będzie skonwertowany: ą ź Ą ś ł'); // Windows-1250 na ISO-8859-2 echo '<br>'.ISO88592_2_UTF8('ten tekst będzie skonwertowany: ą ć ż Ą Ę Ó Ł Ż Ź ó ł ń Ń'); // ISO-8859-2 na UTF-8 Aby skonwertować z UTF-8 na ISO-8859-1 można skorzystać z funkcji "utf8_decode" a z ISO-8859-1 na UTF-8 z funkcji "utf8_encode" Ostatnio przydało mi się to bardzo i mam nadzieję że przyda się to jeszcze komuś więc to tu zamieszczam :) */ //////////////////////////////////////// function compress( $srcFileName, $dstFileName ) { // getting file content // writing compressed file $zp = gzopen( $dstFileName, "w9" ); gzwrite( $zp, $data ); gzclose( $zp ); } //compress("/web/myfile.dat", "/web/myfile.gz"); function uncompress($srcName, $dstName) { } //uncompress("./myfile.txt.gz", "./myfile.txt"); ?>
import.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" /> <title>Import danych słownikowych</title> </head> <body> <?php /* Importowanie dużych plików w formacie CSV */ //////////////////////////////////////////////////////////////////// require_once('config.inc.php'); require_once('funkcje.inc.php'); //////////////////////////////////////////////////////////////////// // data "¶roda","czwartek","pi±tek","sobota"); "maja","czerwca","lipca","sierpnia","wrze¶nia", "paĽdziernika","listopada","grudnia"); /////////////////// //czas start $gentime = $gentime[1] + $gentime[0]; $pg_start = $gentime; /////////////////// /* $db = mysql_connect (!mysql_select_db("magazyn",$db)) mysql_affected_rows($db) fgetcsv */ if ($czy_usunac = 1) { } //mkdir("./tmp/", 0777); chmod("./tmp/", 0777); // nadaje prawa czytania i zapisu dla każdego uncompress("./$plik.gz", "./tmp/$plik"); } foreach($plik as $linia) { $i++; //list($slowo) = explode('|', trim($linia)); //$komentarze = array("^--", "^---", "^#", "^;"); //list($key,$kom)=each($komentarze) //if (!eregi($kom, $linia)) { /* konwertujemy wbudowaną funkcją if ($funkcja_iconv = true) { if ($konwersja = 1) { $linia = iconv("ISO-8859-2", "UTF-8", $linia); //lub $linia = mb_convert_encoding($linia, 'ISO-8859-2', 'UTF-8'); } if ($konwersja = 2) { $linia = iconv("UTF-8", "ISO-8859-2//IGNORE", $linia); } } else { echo "Kodowanie nie zostało zmienione bo funkcja konwertująca iconv nie jest dost
ępna a tym serwerze!"; } */ if ($konwersja = 1) { ISO88592_2_UTF8("$linia"); } if ($konwersja = 2) { UTF8_2_ISO88592("$linia"); } //echo ($linia.'<br />'); //DEBUG $rekordow++; } } //sortujemy dane w bazie if ($czy_posortowac = 1) { } //sortujemy dane w bazie if ($czy_indeksowac = 1) { } } ////// //czas stop $gentime = $gentime[1] + $gentime[0]; $pg_end = $gentime; $totaltime = ($pg_end - $pg_start); echo("Zaimportowałem: <strong>" . $rekordow . "</strong> rekordy(ów) do tabeli: <strong>".$sql_tabela."</strong><br /><br />"); ?> </body> </html>
Wynik wykonania skryptu:
Cytat
Data rozpoczęcia importu: piątek, 15 lutego 2008 roku, godzina: 05:45:21
Importowany plik to: slownik_pl.csv
Importowanie trwało: 1260.6495 sekund(y)
Zaimportowałem: 3336461 rekordy(ów) do tabeli: slownik_pl
Data zakończenia importu: piątek, 15 lutego 2008 roku, godzina: 06:06:22
Importowany plik to: slownik_pl.csv
Importowanie trwało: 1260.6495 sekund(y)
Zaimportowałem: 3336461 rekordy(ów) do tabeli: slownik_pl
Data zakończenia importu: piątek, 15 lutego 2008 roku, godzina: 06:06:22
xxx