Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [xml][php][mysql]Duże pliki do bazy MySQL
b_chmura
post
Post #1





Grupa: Zarejestrowani
Postów: 813
Pomógł: 34
Dołączył: 18.03.2007
Skąd: o stamtąd

Ostrzeżenie: (0%)
-----


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

Ten post edytował b_chmura 1.10.2010, 10:27:57
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
zzeus
post
Post #2





Grupa: Zarejestrowani
Postów: 441
Pomógł: 71
Dołączył: 3.09.2007
Skąd: wrocław

Ostrzeżenie: (0%)
-----


  1. ini_set("max_execution_time", "");


--------------------
Go to the top of the page
+Quote Post
b_chmura
post
Post #3





Grupa: Zarejestrowani
Postów: 813
Pomógł: 34
Dołączył: 18.03.2007
Skąd: o stamtąd

Ostrzeżenie: (0%)
-----


Nie mogę ustalić czasu wykonywania skryptu bo nie wiem ile on będzie trwał (lub może być różny. Więc odpada.
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




I dlatego dostales kod na ustawienie czasu FOREVER


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
b_chmura
post
Post #5





Grupa: Zarejestrowani
Postów: 813
Pomógł: 34
Dołączył: 18.03.2007
Skąd: o stamtąd

Ostrzeżenie: (0%)
-----


Na serwerach nazwa.pl nie można zmienić czasu wykonywania skryptu. Jakieś inne pomysły? Ewentualnie dlaczego moje rozwiązanie się nie sprawdza?
Go to the top of the page
+Quote Post
CuteOne
post
Post #6





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

Ostrzeżenie: (0%)
-----


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ć ;]
Go to the top of the page
+Quote Post
b_chmura
post
Post #7





Grupa: Zarejestrowani
Postów: 813
Pomógł: 34
Dołączył: 18.03.2007
Skąd: o stamtąd

Ostrzeżenie: (0%)
-----


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ę.
Go to the top of the page
+Quote Post
lukaskolista
post
Post #8





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

Ostrzeżenie: (0%)
-----


rozwiazanie jest proste - zapisuj pliki na dysku, a w bazie ich sciezki
Go to the top of the page
+Quote Post
b_chmura
post
Post #9





Grupa: Zarejestrowani
Postów: 813
Pomógł: 34
Dołączył: 18.03.2007
Skąd: o stamtąd

Ostrzeżenie: (0%)
-----


ale ja chce je przenieść do bazy danych. Nie chce ich mieć w plikach.
Go to the top of the page
+Quote Post
Crozin
post
Post #10





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 09:21