ugrás a tartalomhoz

Megszámolni az oldalon futó összes sql query-t és kiiratni a parancsot

killroy · 2008. Okt. 4. (Szo), 12.11
Hello mindenki!

Szeretnék tanácsot kérni, hogy milyen módszerrel számoljam meg azt, hogy egy oldal/url betöltésekor hány db sql parancs ment el az adatbázis felé továbbá az éppen elküldött parancsokat ki is szeretném iratni.

A válaszokat előre is köszönöm.
 
1

DB réteg

vbence · 2008. Okt. 4. (Szo), 12.31
Ez az, amit könnyen megtehetsz, ha a kódódba nem direkte a mysq_query -t hívogatod, hanem írtál egy saját wrapper funkciót (neadjisten osztályt).

Ha mysql_query-k vannak mindenütt, még akkor is javíthatsz a helyzeten, például úgy, hogy nyomsz egy "replace in files" funkciót a kedvenc editorodban és kicseréled az összes mysql_query hívást mondjuk my_mysql_query -re, és egy megfelelő en központi helyen definiálod is:
  1. function my_mysql_query ($query$link_identifier = null) {  
  2.     $ret = $link_identifier == null ? mysql_query ($query) : mysql_query ($query$link_identifier);  
  3.     echo ('<pre class="debug">' . htmlspecialchars ($query) . '</pre>');  
  4.     return $ret;  
  5. }  
2

Igazából úgy szeretném

killroy · 2008. Okt. 4. (Szo), 13.11
Igazából úgy szeretném, hogy az oldal alján van egy "sql parancs gyűjtő" ahol kiíratom hogy éppen hány sql parancs ment el a szervernek és azokat kiíratni.

Gondolom úgy kell hogy létrehozok egy tömböt és azokat a lekéréseket amik éppen lefutnak egy adott oldal betöltésekor berakom ebbe a tömbbe, majd az oldal alján megszámolom hogy hány db elme van ennek a tömbnek és kiíratok az elemeket. Majd miután betöltődött az oldal a kód legvégén "unset"-elem a tömböt.
4

echo helyett.....

troy1979 · 2008. Okt. 4. (Szo), 14.23
Akkor használd azt a wrapper fv-t amit a bence irt, csak a képernyő helyett 1 globalis tömbhöz add hozzá a lekérdezést

1) a fv elején:

global $page_queries=array();

echo ('<pre class="debug">' . htmlspecialchars ($query) . '</pre>');

helyett

$page_queries[]='<pre class="debug">' . htmlspecialchars ($query) . '</pre>'

és az oldalmegjelenítés végén simán kiirathatod a $page_queries tömb tartalmát
3

Esetleg a mysql query log használatával

troy1979 · 2008. Okt. 4. (Szo), 14.08
Ekkor a php-hez egyáltalán nem kell nyúlnod

Ez olyan esetekben lehet hasznos, amikor nem te irtad/ nem ismered a php kódot ( nem kell semmit keresgélni a php-ben :))

viszont hátránya a dolognak hogy amig ki nem kapcsolod, addig minden mysql user minden kérését logolja , vagyis csak 1 teszt szerveren tudod ezt megcsinálni, és minden egyes oldal lekérés utána ajánlott megnézni a logot (mert azt nem rögzíti pl hogy melyik oldalt nézted meg )
5

hmm..

killroy · 2008. Okt. 4. (Szo), 14.42
Megcsináltam ezt a gyűjtős módszert amit az előbb írtam. Természetesen csináltam egy függvényt, olyasmit mint a my_mysql_query() ami azt csinálja hogy lefuttat egy mysql_query() függvényt és egy globális tömb végére mindig hozzá fűzi a parancsot.

Jól is működik az összes lefutó SELECT-et kitudom írni de az UPDATE és INSERT INTO parancsok nem kerülnek bele a tömbbe pedig 100% hogy lefutnak.

Érdekes...
6

Kérdés, hogy azokat is burkolod-e

vbence · 2008. Okt. 4. (Szo), 14.52
Talán abban a részében az oldalnak nem cserélted le. Többet csak akkor tudunk mondani, ha bemásolod a saját függvényt.
7

a kód

killroy · 2008. Okt. 4. (Szo), 16.01
Itt a "wrapper fv":
  1. $queries = array();  
  2.   
  3. function my_mysql_query($sql)  
  4. {  
  5.     $result = mysql_query($sqlor die(mysql_error());  
  6.     global $queries;  
  7.     array_push($queries$sql);   
  8.     return $result;  
  9. }  
query-k kiíratása, amit a teljes php kód legvégén futtatok le:
  1. $numQueries = count($queries) ;  
  2.       
  3.     for ($i=0; $i<$numQueries$i++)  
  4.     {  
  5.         echo $queries[$i] . '<br /><br />';  
  6.     }  
  7.     unset($queries);  
És tuti hogy a my_mysql_query()-t használom minden parancs küldésekor.
8

Irasd akkor ki, ha latszik,

efpe · 2008. Okt. 4. (Szo), 21.04
Irasd akkor ki, ha latszik, akkor nem kerul bele a tombbe. Probald meg a mysql_query() elott belenyomni. A kiiratashoz meg foreach()