Allt eftersom en webbapplikation växer i storlek kan det vara svårt att hålla ordning på alla databasfrågor som körs vid exekveringen av applikationen. Genom att omdefiniera PHPs databasfunktioner med hjälp av php-modulen runkit kan man skapa en logger som hjälper till att hålla ordning på databasfrågorna i applikationen. Detta har två fördelar:
- Man får en överblick av MySQL-frågorna vilket gör utvecklingen av webbapplikationen lättare.
- Genom att omstrukturera databasfrågor och undvika redundanta frågor kan databasaktiviteten effektiviseras och minskas.
Så här gör man:
<?php
runkit_function_copy('mysql_query', 'mysql_query_original');
runkit_function_redefine('mysql_query', '$q', '$dump = debug_backtrace(); $a["query"] = $q; $a["file"] = basename($dump[0]["file"]); $a["line"] = $dump[0]["line"]; array_push($GLOBALS["queries"], $a); return mysql_query_original($q);'));
print_r($GLOBALS['queries']);
?>
I första steget kopieras originaldefinitionen av mysql_query till en annan funktion mysql_query_original. Därefter omdefinieras mysql_query till att logga all queries i en global variabel innan de utförs. Till sist är det bara att skriva ut den globala variabeln för att se samtliga frågor som har körts så långt i exekveringen.
Voila! Vi har en komplett mysql-logger som sparar alla dina queries, vilken fil de körs i och vilken rad i filen. Det är bara att börja optimera!
En problem med denna metod är att runkit normalt inte ingår i en PHP-installation. Modulen måste antingen kompileras med PHP eller laddas dynamisk vid runtime eller statiskt i php.ini, vilket förmodligen får de flesta webbhotelladministratörer att se rött. Dock är denna teknik främst användbar under utvecklingen av en applikation (p.g.a. den introducerade overheaden). Så om man sköter utvecklingen på en egen utvecklingsserver så är det inga problem att installera modulen.
Länk till runkit.