Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Dlaczego skrypy tak dziwnie dodaje do bazydanych
Forum PHP.pl > Forum > Przedszkole
silverwind
Ten skrypt nie chce mi dodać do tabeli 1000000. Są jakieś ograniczenia w Mysql. Jak dodaje 10000 to idzie jak drugi raz uruchomię to tak różnie dodaje. Znacie może jakoś funkcje co mierzy czas wykonywania skryptu




  1. <?php
  2. $stara_wartosc = ini_set ( 'max_execution_time', 0 );
  3. $con = mysqli_connect("localhost","root","","my_db");
  4. if($con)
  5. // Check connection
  6. if (mysqli_connect_errno())
  7. {
  8. echo "Failed to connect to MySQL: " . mysqli_connect_error();
  9. }
  10.  
  11. $query = "INSERT INTO osoby (`Imie`, `Nazwisko`,`Wiek`) VALUES ";
  12. for($i=0; $i<1000000; $i++)
  13. {
  14. $query .= "('imie', 'nazwisko', 'wiek')";
  15.  
  16.  
  17.  
  18. }
  19. //$query = substr($query, 0, -1); // na końcu nie może być przecinka więc go ucinam
  20. mysqli_query($con,$query);
  21.  
  22.  
  23. mysqli_close($con);
  24. ?>
aniolekx
brakuje przecinka ~~ zgadnij gdzie wink.gif
Rysh
Nie możesz tego dodawać na części? Pozatym tak jak kolega wyżej pisze, brakuje Ci przecinka.
silverwind
oki poprawiłem przycinek ale to nic nie zmienia dodaje przy 10000. może mi ktoś wytłumaczyć lub napisać jak to ma być. Che testować baszę danych i dodać np 1000000 rekordów .
nospor
Zamiast robic jedno zapytanie, ktore na raz dodaje milion rekordow, napisz milion zapytan ktore dodaje 1 rekord.
A jak masz fantazje, to dodawaj po 1000 rekordow w jednym zapytaniu
silverwind
Gdzie się w my.in ustawia czas wykonania skrytpu. Próbowałem bezpośrednio w mysql i podobny problem zacina się baza danych .

  1. DELIMITER #
  2. CREATE PROCEDURE A2()
  3.  
  4. BEGIN
  5. DECLARE a INT DEFAULT 1 ;
  6. simple_loop: LOOP
  7. INSERT INTO osoby (`Imie`, `Nazwisko`,`Wiek`) VALUES('imie', 'nazwisko', 'wiek');
  8. SET a=a+1;
  9. IF a=1000000 THEN
  10. LEAVE simple_loop;
  11. END IF;
  12. END LOOP simple_loop;
  13. END #
rad11
Czas dzialania skryptu mozesz ustawic poprzez set_time_limit, ini_set lub besposrednio w php.ini na serwerze.
silverwind

Już rozwiązałem problem trzeba dodać $cfg['ExecTimeLimit'] = 0; w config.inc.php . Są jakieś funkcje co liczą czas wykonywanie skryptu np. wyświetla mi czas i mierzy jak długo się wykonuje.
grzes999
Funkcji z tego co się oreintuję to nie ma. Są rózne narzędzie do tego, bądź możesz to robić w ten sposób

  1. $time_start = getmicrotime();
  2. //jakieś operacje
  3. $time_stop = getmicrotime();
  4.  
  5. echo 'Czas wczytywania pliku: ' . ($time_stop - $time_start);
silverwind
Zastanawiam mnie pewna różnica jak używam tego skryptu w php to czas wykonywanie jest 50 sekund a jak robię to z poziomu phpMyadmin zapytanie w sql to trwa to koło godziny może wiecie czemu tak jest .
  1. DELIMITER #
  2. CREATE PROCEDURE A()
  3.  
  4. BEGIN
  5. DECLARE a INT DEFAULT 1 ;
  6. simple_loop: LOOP
  7. INSERT INTO osoby (`Imie`, `Nazwisko`,`Wiek`) VALUES('imie', 'nazwisko', 'wiek');
  8. SET a=a+1;
  9. IF a=1000000 THEN
  10. LEAVE simple_loop;
  11. END IF;
  12. END LOOP simple_loop;
  13. END #

  1. CALL `A`()`




  1. <?php
  2. //$stara_wartosc = ini_set ( 'max_execution_time', 0 );
  3. //error_reporting(0);
  4. $con = mysqli_connect("localhost","root","","my_db");
  5. if($con)
  6. // Check connection
  7. if (mysqli_connect_errno())
  8. {
  9. echo "Failed to connect to MySQL: " . mysqli_connect_error();
  10. }
  11.  
  12. $stoper_start = time(true); // start pomiaru
  13.  
  14. //mierzony skrypt ////////////////////////
  15. usleep(10000);
  16. $query = "INSERT INTO osoby (`Imie`, `Nazwisko`,`Wiek`) VALUES ";
  17.  
  18.  
  19. for($i=0; $i<1000000; $i++)
  20. {
  21. $query .= "('imie', 'nazwisko', 'wiek'),";
  22.  
  23. }
  24.  
  25. $query = substr($query, 0, -1); // na końcu nie może być przecinka więc go ucinam
  26. mysqli_query($con,$query);
  27.  
  28. $stoper_stop = time(true); //koniec pomiaru
  29.  
  30. echo bcsub($stoper_stop, $stoper_start, 2); // wynik np 1.0123 sekundy
  31.  
  32.  
  33.  
  34.  
  35. mysqli_close($con);
  36. ?>
nospor
Poniewaz za pierwszym razem wykonujesz milion krotkich zapytan a za drugim razem jedno długie. Wieksza libcza zapytan powoduje wydłużenie ich czasu wykonywania
silverwind
Trochę szukałem ale nie mogłem znaleźć innej pętli pod Mysql. Jak zrobić bezpośrednio pod mysql taką petle? Czy idzie w ogóle?
mmmmmmm
Napisz co konkretnie chcesz zrobić. Nie wierzę że ma to być milion takich samych rekordów
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.