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
CuteOne
post
Post #2





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

Posty w temacie


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

 



RSS Aktualny czas: 8.10.2025 - 02:31