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:

function my_mysql_query ($query, $link_identifier = null) {
    $ret = $link_identifier == null ? mysql_query ($query) : mysql_query ($query, $link_identifier);
    echo ('<pre class="debug">' . htmlspecialchars ($query) . '</pre>');
    return $ret;
}
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":

$queries = array();

function my_mysql_query($sql)
{
	$result = mysql_query($sql) or die(mysql_error());
	global $queries;
	array_push($queries, $sql); 
	return $result;
}
query-k kiíratása, amit a teljes php kód legvégén futtatok le:

$numQueries = count($queries) ;
	
	for ($i=0; $i<$numQueries; $i++)
	{
		echo $queries[$i] . '<br /><br />';
	}
	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()