Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][mysql] Problem - Rozwiązany
Forum PHP.pl > Forum > Bazy danych > MySQL
lunlog
Witam, mam mały problem dot. wstawiania danych do bazy (1M wierszy), klient którego używam jest w wersji 3.23.39. Dane generuje lokalnie za pomoca skryptu php:

  1. <?php
  2.  
  3. //czesc generujaca wspolrzedne, najpierw "x" potem "y" na koncu "z".
  4.  
  5. include ('1.php'); // connection script include
  6.  
  7. $limit = 100;
  8.  
  9. for( $pozz = 1; $pozz <= $limit; $pozz++ )
  10. for( $pozy = 1; $pozy <= $limit; $pozy++ )
  11. for( $pozx = 1; $pozx <= $limit; $pozx++ ){
  12.  
  13. //$wl -zmienna okreslajaca roznorodnosc asteroid
  14.  
  15. $wl=rand(1,1000);
  16. unset($name, $minerals1, $minerals2);
  17.  
  18. //czesc generujaca rozne typy asteroid oraz wielkosci mineralow w zaleznosci od ro
    zmiaru
  19.  
  20. if($wl>900) {
  21.  $size=rand (227,255);
  22.  $minerals1=rand (58300,65500);
  23.  $minerals2=rand (58300,65500); }
  24. else if($wl>800) {
  25.  $size=rand (199,226);
  26.  $minerals1=rand (51100,58299);
  27.  $minerals2=rand (51100,58299); }
  28. else if($wl>700) {
  29.  $size=rand (171,198);
  30.  $minerals1=rand (43900,51099);
  31.  $minerals2=rand (43900,51099); }
  32. else if($wl>600) {
  33.  $size=rand (143,170);
  34.  $minerals1=rand (36700,43899);
  35.  $minerals2=rand (36700,43899); }
  36. else if($wl>500) {
  37.  $size=rand (115,142);
  38.  $minerals1=rand (29500,36699);
  39.  $minerals2=rand (29500,36699); }
  40. else if($wl>400) {
  41.  $size=rand (87,114);
  42.  $minerals1=rand (22300,29499);
  43.  $minerals2=rand (22300,29499); }
  44. else if($wl>300) {
  45.  $size=rand (59,86);
  46.  $minerals1=rand (15100,22299);
  47.  $minerals2=rand (15100,22299); }
  48. else if($wl>200) {
  49.  $size=rand (31,58);
  50.  $minerals1=rand (7900,15099);
  51.  $minerals2=rand (7900,15099); }
  52. else if($wl>100) {
  53.  $size=rand (3,30);
  54.  $minerals1=rand (700,7899);
  55.  $minerals2=rand (700,7899); }
  56. else{
  57. $size=NULL;
  58. $minerals1=NULL;
  59. $minerals2=NULL; 
  60.  }
  61.  
  62. // generacja nazwy
  63. if ($wl>100) {
  64. $ile = rand(3,5); //ile literek w nazwie
  65. $sam = array('a', 'u', 'e', 'i', 'o'); //samogloski
  66. $spo = array('b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't', 'w', 'x', 'y', 'z', 'q'); //spolgloski
  67. $name = "";
  68.  
  69. for($i = 0; $i < $ile; $i++) 
  70.  
  71. { 
  72. if($i % 2 == 1) 
  73.  {
  74. if($i == 0)
  75.  {
  76.  $name .= strtoupper($sam[rand(0, count($sam)-1)]);
  77.  }  
  78. else
  79.  {
  80. $name .= $sam[rand(0, count($sam)-1)];
  81. }
  82. } 
  83. else 
  84.  {
  85.  if($i == 0)
  86.  {
  87. $name .= strtoupper($spo[rand(0, count($spo)-1)]);
  88. }
  89.  else
  90.  {
  91. $name .= $spo[rand(0, count($spo)-1)];
  92. }
  93. }}}
  94.  
  95. // koniec generowania nazwy
  96.  
  97.  
  98.  
  99. // $name $size $minerals1 $minerals2 $pozx $pozy $pozz -zmienne umieszczane w bazie danych
  100.  
  101.  
  102. $insert = "INSERT INTO tab_ast (name, pozx, pozy, pozz, size, min1, min2) VALUES ('$name', '$pozx', '$pozy', '$pozz', '$size', '$minerals1', '$minerals2')";
  103. query($insert);
  104.  
  105. /*wyjscie - opcjonalnie
  106.  
  107. echo "Poz X =$pozx , Poz Y =$pozy , Poz Z = $pozz <br>";
  108. echo "Rozmiar Asteroidy to $size , nazwa: $name <br><br>";
  109. */
  110.  
  111. }
  112.  
  113. ?>


Lecz tutaj pojawia się problem. Skrypt wstawia maksymalnie 100 wierszy, po czym przestaje odpowiadać. Przypuszczam że problem lezy w delay_key_writes którego bufor zapycha się pod nawałem informacji ze skryptu php (10k wieszy generuje się w około 35 sekund). Jak mogę tą funkcję wyłączyć lub też jakie moga byc inne przyczyny takiego zachowania się bazy mysql ? Może mam coś nie tak ze skryptem ?
lunlog
Skrypt nie wywala sie z powodu timeout. Moge go uruchomic nawet na sekunde a i tak wstawi tylko 100 rekordow do bazy. Moge go rowniez uruchomic na godzine 3600 sekund a i tak wstawi tylko 100 rekordow. Wiec timeout odpada...
spenalzo
mysql_error" title="Zobacz w manualu php" target="_manual
Może mysql gdzies sie wysypuje?
lunlog
Mozliwe, ale zeby za kazdym razem wstawial nie wiecej, nie mniej tylko 100 rekordow ? To bardziej podpada pod jakis blad w ustawieniach zmiennych servera mysql, a jedyna zmienna ustawiona w moim serverze na wartosc 100 to delay_key_write, czy tam jakas funkcja zalezna od niej...

Ma ktos pomysl jak wylaczyc ta funkcje ?

w manualach wyczytalem ze mozna tego dokonac poleceniem SET ale nie zabardzo wiem jak... i gdzie, probowalem zdefiniowac zmienna w zakladce [mysqld] w pliczku my.ini aczkolwiek tylko polozylem server... wiec juz nie wiem kompletnie co mam z tym zrobic...

Jak bede w domu to sprawdze czy mysql wysypuje jakies konkretne bledy po dodaniu tego 100-nego rekordu.
spenalzo
Przyjrzyj sie temu fragmentowi kodu - tak długo, aż nie znajdziesz 2 bŁędów winksmiley.jpg
  1. <?php
  2.  
  3. $limit = 100;
  4.  
  5. for( $pozx = 1; $pozz <= $limit; $pozz++ )
  6. for( $pozy = 1; $pozy <= $limit; $pozy++ )
  7. for( $pozz = 1; $pozx <= $limit; $pozx++ ){
  8. ?>


Jak je poprawisz, skrypt powinien ruszyc - bo u mnie przed poprawą sie zapętlał.

Natomiast ilość rekordów nie ma specjalnego znaczenia - ja u siebie dodaje 10 000 rekordów w czasie 4 sekund poprzez niezależne INSERTy (10 000 zapytan).
lunlog
Sprawdze sobie w domqu... po 23 tongue.gif teraz work work work tongue.gif


//edit

2 bledy ?, ja tutaj tylko bym wstawil wartosci liczbowe i wywalil zmienna $limit, bo wczesniej tak dzialalo dobrze... a 2 blad ? nie mam pojecia... w tym kawalku ktory zaznaczyles nie ma } ale to pewnie przypadek....
spenalzo
"Znajdź dwa szczegóły różniące poniższe obrazki"
  1. <?php
  2. $limit = 100;
  3.  
  4. for( $pozx = 1; $pozz <= $limit; $pozz++ )
  5. for( $pozy = 1; $pozy <= $limit; $pozy++ )
  6. for( $pozz = 1; $pozx <= $limit; $pozx++ ){
  7. ?>


  1. <?php
  2. $limit = 100;
  3.  
  4. for( $pozz = 1; $pozz <= $limit; $pozz++ )
  5. for( $pozy = 1; $pozy <= $limit; $pozy++ )
  6. for( $pozx = 1; $pozx <= $limit; $pozx++ ){
  7. ?>


winksmiley.jpg
lunlog
Diabel tkwi w szczegolach... podobno biggrin.gif dzieki za pomoc, sprawdze sobie jak to dziala i czy dalej bedzie wstawialo tylko 100 pierwszych tongue.gif

Nie spodziewalbym sie ze tutaj bede mial blad...


//edit

Tak czy siak, skrypt nie wywala się po 100 wpisanych rekordach tak jak wcześniej... teraz wywala się po 3700 wstawionych rekordach (ironia), jest lepiej ale to jeszcze nie jest to... docelowo skrypt powinien wstawić 1M danych.

Ma ktoś jakiś pomysł co wywala mi skrypt tym razem ? zmieniłem

set-variable=key_buffer=16M

na

set-variable=key_buffer=256M

ale to nie pomogło... może mój problem wynika ze sposobu w jaki lacze sie z baza danych ? po tych 3700 rekordach mysql wywala mi bledy ze nie moze sie polaczyc z baza danych...

  1. <?php
  2.  
  3. //tutaj deklaracja zmiennych - wykasowana ofcorz tongue.gif
  4.  
  5. function query($query)
  6. {
  7. global $db_host, $db_user, $db_pass, $db_name;
  8. $link = mysql_connect("$db_host", "$db_user", "$db_pass");
  9. mysql_select_db("$db_name", $link);
  10. $result = mysql_query("$query", $link);
  11. mysql_close($link);
  12. return $result;
  13. }
  14.  
  15.  
  16. ?>



A teraz pytanie z innej beczki, może tem problem który mam w tej chwili, wlewanie maksymalnie 3700 rekordow do bazy danych wiąże się z jakimis ustawieniami mojego serwera ? Na wypadek jak ktoś byłby tak wielkoduszny i chciał stworzyć mi pliczek importu dla tego skryptu to podaje kod tabeli do której wlewane sa dane tongue.gif

  1. CREATE TABLE `tab_ast` (
  2. `id` mediumint(6) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `name` varchar(7) DEFAULT 'no name',
  4. `pozx` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  5. `pozy` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  6. `pozz` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  7. `size` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  8. `min1` smallint(5) UNSIGNED NOT NULL DEFAULT '0',
  9. `min2` smallint(5) UNSIGNED NOT NULL DEFAULT '0',
  10. `user_id` mediumint(6) UNSIGNED NOT NULL DEFAULT '0',
  11. PRIMARY KEY (`id`)
  12. ) TYPE=MyISAM AUTO_INCREMENT=1 ;


Jakby cos to prosze o informacje na PW biggrin.gif lub w tym temacie.
spenalzo
Nadal nie napisałeś, czy mysql rzuca jakieś błędy po uzyciu mysql_error. (
  1. <?php
  2. mysql_query("cos") or die("Błąd mysql: ".mysql_error());
  3. ?>


Natomiast ta zmienna nie sądze zeby miała wpływ, gdyż służy ona do czegoś innego. Jak to nie pomoże, to zobacz czy w odpowiednim miejscu masz ustawiony insert.

A jak to nie pomoze to zmien mysql-a na jakas wersje 4.x.x
lunlog
Po jakimś czasie wywala to.. po kilku sekundach.

Kod
Warning: Can't connect to MySQL server on 'localhost' (10048) in C:\FoxServ\www\1.php on line 11

Warning: MySQL Connection Failed: Can't connect to MySQL server on 'localhost' (10048) in C:\FoxServ\www\1.php on line 11

Warning: mysql_select_db(): supplied argument is not a valid MySQL-Link resource in C:\FoxServ\www\1.php on line 12

Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in C:\FoxServ\www\1.php on line 13
Błšd mysql: Can't connect to MySQL server on 'localhost' (10048


i nic pozatym...

moj obecny plik 1.php

  1.  
  2. <?php
  3.  
  4. $db_host='';
  5. $db_user='';
  6. $db_name='';
  7. $db_pass='';
  8.  
  9. function query($query)
  10. {
  11. global $db_host, $db_user, $db_pass, $db_name;
  12. $link = mysql_connect("$db_host", "$db_user", "$db_pass");
  13. mysql_select_db("$db_name", $link);
  14. $result = mysql_query("$query", $link) or die("Błšd mysql: ".mysql_error());
  15. mysql_close($link);
  16. return $result;
  17. }
  18.  
  19. ?>
popo
Cytat
Warning: MySQL Connection Failed: Can't connect to MySQL server on 'localhost' (10048)

oznacza ze nie mozna nawiazac polaczenia z serwerem mysql na localhoscie

radze sprawdzic czy aby napewno mysql dziala (czy demon jest odpalony i nasluchuje polaczen)
lunlog
Tyle to ja wiem, hehe. Usluga podczas odpalania skryptu dziala na pewno...
spenalzo
Wiesz.... jak wywolujesz w pętli połączenie do MySQL to cóż... chcesz otworzyć milion połączen?


Teraz widzisz dlaczego trzeba podawać błędy jakie generuje skrypt - jakbys pokazal od rauz, to temat byłby rozwiazany 2dni temu tongue.gif
lunlog
O.o ze co ? zapytanie wywoluje w petli przed wyslaniem danych do bazy... nie rozumiem... jak w pentli ? to to sie robi inaczej ? nie kumam cza-czy...

Macie jakies propozycja naprawy tego ? Gdzie mam blad w skrypcie generujacym dane czy w pliku z ktorego korzysta ten plik generujacy ?

Query przeciez sie zamyka po skonczeniu wysylania danych do bazy. (chyba)

//edit

if (!query($link); {

query($link); }

else {

}

cos takiego ? styknie ? (pisze na szybko w pracy tongue.gif)
spenalzo
Nie, nie coś takiego.

Przeanalizuj sobie swoją funkcje QUERY, a potem zobacz gdzie ją używasz.

Nie szkodzi, że sei zamyka polaczenie - jak dla mnie sam fakt wywołania miliona polaczń jest bez sensu... Polaczenie nawiazuje sie na poczatku skrypyu, a nie przy kazdym wywolaniu zapytania.
lunlog
Dobra pokombinuje i powiem jak mi poszło..... chociaz nie wiem dokładnie jak to mam zrobić... ale dzięki za namiary gdzie leży problem.


//edit

Działa wkońcu ! ha, zmieniłem układ skryptu ładowania w ten sposób że łączy się z serverem tylko raz... i query wykonuje w momencie kiedy musi... znaczy sie połączy się z baza danych i rozłączy dopiero po zakończeniu funkcji query biggrin.gif

Na początku skrypt wstawił mi o 72k wierszy za duzo... ale to chyba moja wina bo zostawiłem jakies smieci w bazie danych... ale za 2 razem wstawił równo 1M biggrin.gif i to w czesie dużo krutszym niż sie spodziewałem... wywaliłem cały output ze skrypu, odpaliłem skrypt i wyłączyłem przegladarkę biggrin.gif

Dziękuje bardzo za pomoc biggrin.gif sam pewnie bym sobie nie poradził. Niech szybkie łącza oraz dobrze napisane skrypty będa z Wami biggrin.gif
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.