Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [xml][php][mysql]Duże pliki do bazy MySQL
Forum PHP.pl > Forum > PHP
b_chmura
Witam
Potrzebowałem stworzyć skrypt którym duży plik xml (prawie 250 mb) przerzucę do bazy MySQL.
Na drodze stanęły mi dwie kłody: pamięć ram komputera to tylko 64mb oraz limit wykonywania skryptu 30 sek.

Poniżej przedstawię wam kod który w moim mniemaniu teoretycznie powinien chodzić jednak wciąż dostaję informację o przekroczonym czasie.
  1. mysql_connect('xxxx', 'xxxx', 'xxxx') or die('Bład! nie można się połączyć z bazą');
  2. mysql_select_db("xxxx") or die('Błąd! nie można wybrać tabeli');
  3. mysql_query("SET NAMES 'utf8'");
  4.  
  5. $fileName = "baza-produktow.xml";
  6. $table = 'xxxx';
  7.  
  8. $_SQL['prefix'] = 'xxxx_xml_';
  9. $_SQL['table'] = $table;
  10. $_SQL['query'] = '';
  11.  
  12.  
  13. $timeLimit = ini_get('max_execution_time');
  14. $time = time();
  15. $limit = $xmlData['cnt'] = 1000;
  16. $i = (empty($_GET['start']))? 0: $_GET['start'];
  17.  
  18. while($xmlData['cnt'] == $limit)
  19. {
  20. if(date("s", time())-date("s", $time) >= ($timeLimit/2)) //teoretycznie jeśli skrypt będzie wykonywał się dłużej jak połowa ustalonego czasu strona powinna się przeładować i zacząć od momentu na którym skończyła
  21. {
  22. header("Location: ?start=".$i);
  23. break;
  24. }
  25.  
  26. $start = $limit*i;
  27.  
  28. $xmlData = getTagFromXML($fileName, $table, $start, $limit); //ta funkcja wyciąga X "rekordów" począwszy od X-ego, i oddaje w stringu
  29. $arrayData = createArrayFormXML($xmlData['data']); //ta z podanego stringa robi tablice z danymi
  30. $_SQL = createSqlForOffer($_SQL, $arrayData); //ta tworzy zapytanie sql do bazy danych
  31. mysql_query($_SQL['queryData']);
  32. mysql_query($_SQL['queryAttributes']);
  33. $i++;
  34. }


Jeśli byłby ktoś wstanie podpowiedzieć ewentualne inne rozwiązanie byłbym wdzięczny.

Pozdrawiam
zzeus
  1. ini_set("max_execution_time", "");
b_chmura
Nie mogę ustalić czasu wykonywania skryptu bo nie wiem ile on będzie trwał (lub może być różny. Więc odpada.
nospor
I dlatego dostales kod na ustawienie czasu FOREVER
b_chmura
Na serwerach nazwa.pl nie można zmienić czasu wykonywania skryptu. Jakieś inne pomysły? Ewentualnie dlaczego moje rozwiązanie się nie sprawdza?
CuteOne
To może zamiast kombinować zrób to ten sposób:
  1.  
  2. $select = mysql_query("SELECT row FROM xml_to_db");
  3. $r = mysql_fetch_array($select);
  4.  
  5. $_db_start = $r['row'];
  6.  
  7. $i = 1;
  8.  
  9. while(1) {
  10.  
  11. if($i > 100) {
  12.  
  13. mysql_query("UPDATE xml_to_db SET row = {$limit}");
  14. header("Location: index.php");
  15. }
  16.  
  17. $start = $_db_start + $i;
  18. $limit = $start + $i;
  19.  
  20. $xmlData = getTagFromXML($fileName, $table, $start, $limit); //ta funkcja wyciąga X "rekordów" począwszy od X-ego, i oddaje w stringu
  21. $arrayData = createArrayFormXML($xmlData['data']); //ta z podanego stringa robi tablice z danymi
  22. $_SQL = createSqlForOffer($_SQL, $arrayData); //ta tworzy zapytanie sql do bazy danych
  23. mysql_query($_SQL['queryData']);
  24. mysql_query($_SQL['queryAttributes']);
  25.  
  26. $_db_start = $limit;
  27.  
  28. $i++;
  29. }


nie jest to eleganckie rozwiązanie ale powinno działać ;]
b_chmura
Problem w czym innym leży. Nie mogę załadować tak dużego pliku z powodu braku pamięci a zwiększyć jej odgórnie nie mogę.
lukaskolista
rozwiazanie jest proste - zapisuj pliki na dysku, a w bazie ich sciezki
b_chmura
ale ja chce je przenieść do bazy danych. Nie chce ich mieć w plikach.
Crozin
Jak rozumiem ma to być jednorazowa operacja, więc... ściągnij sobie ten plik na swój lokalny komputer, potraktuj go całego simplyxmlemem, zapisz dane do bazy, wyeksportuj bazę. Trochę czasu stracisz czekając aż dane się ściągną/wyślą, ale w tym czasie możesz porobić coś pożytecznego.

Nie będziesz się musiał bawić w jakieś partycjonowanie XMLa itp. itd.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.