Nije sve jedno
Nedavno sam imao jedan misteriozan problem. Imao sam zadatak da provalim zašto se vuče jedan sajt pa je posle gledanja koda prvo što mi je palo na pamet da proverim sve querije. Pošto nemam shell pristup, pa tako ni pristup logovima, napravio sam da se svaki mysql query loguje za svako izvršenje scripta pri čemu beleži i vreme izvrešenje querija. Otvorim početnu stranu i za malo da padnem sa stolice, vidim da je izvršeno preko 80 querija ?!?!
Gledam kod, ne vidim ništa sumnjivo, počnem polako da izbacujem deo po deo… prvo sadržaj - opet isto. Izbacim levu kolonu, i dalje isto, izbacim desnu koloni - ništa se ne menja…. već počinjem da tripujem. Na kraju na strani ostaje samo HTML header i i dalje se izvršava oko 80 querija, tek nekoliko manje nego kada je ceo sadržaj bio tu.
Krenem da izbacujem redom iz HEAD, izbacim CSS, ništa, izbacim eksterni javascript… e to ga nađem, tu je problem!
Vratim sve ostalo, ali bez javascripta, izvrši se lepo 7 querija kako i treba da bude. E sad nastupa zbunjivanje, kakve veze ima javascript sa izvršavanjem mysql querija?
Hajde da pogledam i taj javascript, možda imaju neke munje za koje nikad nisam čuo pa neka funkcija poziva neki query, znam da nema nikakvih asinhronih zahteva na sajtu. Pogledam kod i i vidim jedan sasvim običan kod za keširanje slika:
if (document.images)
{
i1 = new Image();
i1.src = '/images/menu1.gif';
i2 = new Image();
i2.src = '/images/menu1.gif';
....
i9 = new Image();
i9.src = '/images/menu1.gif';
}
Hajde da sklanjam redom iz tog JS pa da vidim…. sklonim ovaj deo… voila! To je to, taj deo koda je pravio po 8 querija za svaku kesiranu sliku.
E tek onda sam bio zbunjen. Otkud ovo? Proverim slike, slike ne postoje, znači to je neki zaostali deo koda, ali zašto ne generiše 404 nego izvršava querije. I na koju foru?
Dok mi se pogled gubio u dubini monitora, setim se da pogledam .htaccess i naravno, odmah nadjem problem:
ErrorDocument 404 /error.php?code=404
Znači problem je što za svaku 404 grešku (not found) on otvara script error.php u kojem se prikazuje obaveštenje o toj grešci, ali u tom scriptu je includovan sav kod kao na index strani. Tako, za svaku od ovih 10 slika koje generisu 404, on poziva script koji izvrši po 8 querija za svaki poziv, tako da na svakoj strani na sajtu (pošto je ovaj JS obačen u HEAD) ima minimum 9 x 8 querija.
Izbacim to keširanje slika i sve se, naravno, ubrza… problem rešen ali posle pola sata cimanja i zbunjivanja.
Šta sad hoću da kažem? Treba biti jako oprezan sa takvim stvarima, jedna obična glupost može da napravi veliki problem. Kasnije sam saznao da su te slike korišćene za menu u prvoj verziji sajta ali da ih niko nije sklonio iz javascripta, verovatno misleći “sve jedno”. Nije sve jedno
u 10:28
Hvala na ideji. Muku mučim sa učitavanjem svog sajta, menjam template, misleći da je tu neka zvrčka ali ništa. Nažalost, nisam baš toliko stručan poput tebe, valjda ću već provaliti u čemu je stos. Samo da uplatim Mb pa da kontam online.
Pozdrav!
u 12:34
[…] MySQL - Kako ukloniti duplikate Ovaj post je donekle inspirisan problemom koji je bluesman opisao na svom blogu. Dva problema koji nemaju veze jedan sa drugim, ali odlično pokazuju zašto poslodavci insistiraju na x godina iskustva (gde x > 2)
[…]