mikmac [ Senator ]
Jak sprawdzic wydajnosc kodu PHP/mysql ??
Dawno temu napisalem strone w PHP korzystajaca z bazy MySQL. Informatykiem nie jestem i umiem akurat tyle aby takie rzeczy zrobic, co wcale nie znaczy, ze jest to poprawnie i wydajnie. Ot dziala.
Jednak ostatnio jakos strona zaczela sie zatykac. Chodzi bardzo wolno - tak jak by byly gdzies puste petle etc.. (tak sobie to tlumacze)
Glownie tam gdzie musi wyswietlic kilkadziesiat-kilkaset odpowiedzi na jednej stronie, wybierajac z raptem 30 tys rekordow wiec chyba nie tak duzo.
Strna jest na platnym serwerze. Co ciekawe zaczelo sie tak robic kilka miesiecy temu a od conajmniej roku nic nie zmienialem w pliku wykonujacym.
Gdy przerzucilem 20 tys rekordow do innej tabeli i zostawilem tylko okolo 10tys predkosc w ogole sie nie zmienila.
I teraz pytanie. Da sie jakos "debugowac" podgladnac co dokladnie jest wykonywane w danej sekundzie i sprawdzic gdzie "uciekaja sekundy" ??
Sephion [ One Winged Angel ]
Sproboj zrobic to na zasadzie testowania pojedynczych kawalkow kodu.
Tu masz taka mala funkcje mojego autorstwa wlasnie do takich rzeczy. Pierwsze wywolanie tylko zapisuje czas, a drugie go wyswietla.
function getmicrotime()
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
function bench()
static $g;
if($g==0)
$g = getmicrotime();
else
$time = round(getmicrotime() - $g, 4);
print($time.'<br/>');
$g=0;
W ten sposob mozesz sprawdzic np. czas wykonania petli czy tez zapytania sql:
bench();
mysql_query('zapytanie');
bench();
nagytow [ Firestarter ]
Ja bym stawial, ze to firma hostingowa zmienila konfiguracje serwera skoro tyle czasu wszystko chodzilo ok i nic w kodzie nie zmieniales.
Jesli chodzi o debugga, to oczywiscie sa debuggery, ale funkcja podana przez Sephiona powinna wystarczyc. Uzywam czegos podobnego, jednak stosuje logowanie do pliku, bo wtedy wyniki sa na biezaco.
Pustych petli raczej nie masz, jesli przedtem ich nie bylo ;)
Taki strzal na slepo: sprawdz, czy zeby wyswietlic strone nie wykonujesz za czesto ciagu: polacz/zapytanie/rozlacz. Polaczenie powinno byc jedno, zapytania tez ograniczaj.
mikmac [ Senator ]
dziekuje wam za odpowiedzi. te funkcje wkleje i postaram sie uzyc ;)
negatyw -->
troche mnie zmartwiles z tym otwieraniem/zamykaniem polaczenia. Kiedys dawno temu zrobilem sobie taki plik:
<?php
include ("../confamm.php");
function SEL($table, $query, $filtr)
global $dbhost, $dbuser, $dbname, $dbpass;
$link = mysql_connect($dbhost, $dbuser, $dbpass);
mysql_select_db($dbname, $link);
$result = mysql_query("SELECT $query from $table $filtr", $link)
or die("Invalid query");
mysql_close($link);
return $result;
function INS($table, $cols, $values)
global $dbhost, $dbuser, $dbname, $dbpass;
$link = mysql_connect($dbhost, $dbuser, $dbpass);
mysql_select_db($dbname, $link);
$result = mysql_query("INSERT into $table $cols VALUES $values", $link);
mysql_close($link);
return $result;
function UPD($table, $query, $filtr)
global $dbhost, $dbuser, $dbname, $dbpass;
$link = mysql_connect($dbhost, $dbuser, $dbpass);
mysql_select_db($dbname, $link);
$result = mysql_query("UPDATE $table SET $query $filtr", $link);
mysql_close($link);
return $result;
function DEL($table, $filtr)
global $dbhost, $dbuser, $dbname, $dbpass;
$link = mysql_connect($dbhost, $dbuser, $dbpass);
mysql_select_db($dbname, $link);
$result = mysql_query("DELETE from $table $filtr", $link)
or die("Invalid query");
mysql_close($link);
return $result;
?>
i od lat korzystam z niego na kazdej stronie. Sprawdzal sie doskonale, ale z tego co mowisz jest malo wydajny... hmm.
Potestowalem jeszce troche wiecej swoja strone i mam takie spostrzezenie. Nie wazne jak wiele jest rekordow w danej tabeli (sprawdzalem przy 100, 1000 oraz 30000) - czas wyswietlenia strony wydluza sie wraz z liczba linii jakie maja zostaw wyswietlone. Jak wynikow jest 10 (10 linii powiedzmy) to wyswietla momentalnie. Jednak jak wynikow jest okolo 500 (powiedzmy 50 firm kazde po 10 zamowien) to juz czas wyswietlenia to jakies 4-6 sekund - duzo.
Czy to mozliwe, ze IE+ Maxthon dlugo "tworzy" taka strone?
nagytow [ Firestarter ]
A jak przebiega wyswietlanie? Czy to jest jeden select i potem petla?
mikmac [ Senator ]
zazwyczaj (bo to jest sporo funkcji, caly plik ma 60Kb) jest to select z jednej tabeli, petla i w niej drugi select z drugiej tabeli w kazdej iteracji petli. I w tym petla wyswietlania az wyswietlimy wszystkie wybrane rekordy. Potem kolejna iteracja glownej petli.
Mniej wiecej tak :)
nagytow [ Firestarter ]
No i tu lezy problem. Zalozmy, ze chcesz wybrac 1000 rekordow z bazy. Robisz selecta (1 zapytanie), potem petla i w kazdej iteracji znow zapytanie (1000 zapytan) - razem 1001 zapytan.
Tak o ~1000 za duzo :P
mikmac [ Senator ]
nagytow -->
mozna by cie pomeczyc na gg badz mail?? :)
nagytow [ Firestarter ]
Twoj gg z profilu jest aktualny?
mikmac [ Senator ]
tak
mikmac [ Senator ]
nagytow -->
Jeszcze raz bardzo dziekuje za pomoc, strona chodzi o wiele szybciej.
chickenom [ ]
A ja mam pytanie, jak wyświetlić na stronie ilość zapytań sql?
Regis [ ]
Piszesz sobie klase, ktora obsluguje zapytania MySQL i bdasz o to, zeby w kazdej metodzie ktora cos robi (SELECT, DELETE, UPDATE itp.) byl fragment ktory zwieksza jakis licznik o 1. Potem wyswietlasz zawartosc tego licznika na koncu strony i juz.
chickenom [ ]
wow :]
Ma ktoś takowy skrypt na zbyciu? :]