Seite 1 von 3

[erledigt] Zeit jeder einzelnen SQL-Abfrage anzeigen lassen

Verfasst: 16.02.2006 22:09
von Gumfuzi
Hallo Leute,

*edit*
fertiger Mod: siehe weiter unten auf dieser Seite!
*/edit*


falls es dafür schon einen Mod gibt:
wo finde ich den?

Ansonsten wäre ich dankbar für einen Tipp:

Es gibt ja den page_generation_mod. Abgeleitet von diesem möchte ich nun eine Liste der DB-Abfragen einer Seite, welche die $sql enthält und daneben oder darunter die benötigte Zeit für diese Abfrage.

Meine Idee dazu:
Am Anfang jeder DB-Abfrage kommt dieser Code:

Code: Alles auswählen

$zmtime = microtime();
$zmtime = explode(" ",$zmtime);
$zmstart = $zmtime[1] + $zmtime[0];
und am Ende dieser:

Code: Alles auswählen

$zmtime = microtime();
$zmtime = explode(" ",$zmtime);
$zmende = $zmtime[1] + $zmtime[0];
$zmtotal = round(($zmende - $zmstart), 5);
Die Dauer ($zmtotal) lasse ich mir per Echo am ende der page_tail.php anzeigen (nur für Admins).

Mein Problem:
in der mysql.php gibt es verschiedene Funktionen, doch meist wird ja immer diese hier ausgeführt:

Code: Alles auswählen

	function sql_query($query = "", $transaction = FALSE)
	{
		$mtime = microtime();
		$mtime = explode(" ",$mtime);
		$mtime = $mtime[1] + $mtime[0];
		$starttime = $mtime;

		// Remove any pre-existing queries
		unset($this->query_result);
		if($query != "")
		{
			$this->num_queries++;

			$this->query_result = @mysql_query($query, $this->db_connect_id);
		}
		if($this->query_result)
		{
			unset($this->row[$this->query_result]);
			unset($this->rowset[$this->query_result]);

			$mtime = microtime();
			$mtime = explode(" ",$mtime);
			$mtime = $mtime[1] + $mtime[0];
			$endtime = $mtime;
		
			$this->sql_time += $endtime - $starttime;

			return $this->query_result;
		}
		else
		{
			$mtime = microtime();
			$mtime = explode(" ",$mtime);
			$mtime = $mtime[1] + $mtime[0];
			$endtime = $mtime;
		
			$this->sql_time += $endtime - $starttime;

			return ( $transaction == END_TRANSACTION ) ? true : false;
		}
	}
(hier sind schon Zeitstopper vom page_generation_mod drin)

Da ich ja nur die Abfragen stoppen will bzw. aufgelistet haben will, genügt es, nur diese Funktion zu "messen"? oder gibt es Ausnahmen, die eine der anderen Funktionen benutzen?

Und wenn ich die ganzen Daten in einen Array packen will, dann muss ich diesen array wo genau mit $global verfügbar machen? in der DB-Funktion oder woanders?

Der Zweck ist, daß man rausfindet, welche Abfrage genau lahmt - wenn eine Seite langsam lädt. Dieses Feature werde ich dann noch mit einem Switch bestücken, wo man das Teil an- und ausschalten kann.

P.S.: das "__LINE__" und "__FILE__" ist ja auch immer verfügbar, oder?

*edit*
das "line" und file" werde ich wohl nicht in der mysql-funktion auslesen können, weil ja dann wohl die Datei und die zeile von der mysql-php aufscheinen, oder?

*nochmaledit*
bis auf die Anzeige, wo die sql-Anfrage gestartet wurde, habe ich es geschafft!
Ideen hierzu noch gesucht...

*letzesEdit*
falls Interesse besteht, schreibe ich eine kleine Anleitung.
Mit dem Code wird die Summe der Zeit aller SQL-Abfragen gezeigt sowie die SQL-Anzahl.
Es wird darunter in einer Tabelle pro SQL-Abfrage die Abfrage und die benötige Zeit für die jeweilige Abfrage gezeigt - so sieht man gleich, wenn eine Anfrage die ganze Seite lahmt.

Re: Alle DB-Abfragen mitstoppen

Verfasst: 17.02.2006 01:28
von Pyramide
Gumfuzi hat geschrieben:bis auf die Anzeige, wo die sql-Anfrage gestartet wurde, habe ich es geschafft!
Ideen hierzu noch gesucht...
Wenn du eine aktuelle PHP-Version hast, bietet sich dafür [php:debug_backtrace] (oder ab PHP 5 sogar noch einfacher debug_print_backtrace) an.

Verfasst: 17.02.2006 11:58
von Gumfuzi
Danke Pyramide!

Klappt wunderbar - werde das gleich dazu einbauen und später mal eine kleine Anleitung dazu posten, falls es jemand braucht.

Verfasst: 17.02.2006 13:01
von Gumfuzi
Ok, hier die Mod-Anleitung:
(seid nicht zu hart, ist mein erster "Mod" ;) )

Code: Alles auswählen

#################################################################
## Mod Title:    SQL-Zeitmessung
## Mod Version:  0.1.1 BETA
## Mod Author: Gumfuzi < ssw@liwest.at >
## Mod Description:
##
##	Dieser Mod erstellt für alle Admins ganz unten im Footer eine Anzeige,
##	wo man die Anzahl der SQL-Queries sowie die benötigte zeit aller SQL-Queries
##	sieht.
##	Darunter erscheint dann eine Tabelle, wo man pro Zeile jeweils SQL-Befehl,
##	Dateiname (wo der SQL-Befehl aufgerufen wurde), die dazugehörige Zeile (Zahl)
##	und die benötige Zeit für den jeweiligen SQL-Befehl.
##
##	Die Variable $zm_switch in der dann geänderten page_tail.php dient zum
##	Ein- und Ausschalten der ganzen Anzeige (SQL-zeitmessung).
##
##	Nur für MySQL & (PHP 4 >= 4.3.0, PHP 5)
##
## Installation Level:  easy
## Installation Time:   2-4 Minuten
##
## Files To Edit:       2
## 			includes/mysql.php
##			includes/page_tail.php
##
## Included Files:      -
##
#################################################################
##
## Author Note:
##
## Beachte, daß diese Version des Mods eine BETA-Version ist, für ev. Schäden
## haftet nicht der Mod-Autor. (immer vor Änderungen ein Backup der Dateien & 
## Datenbank machen!)
##
## Der Mod ist auch kompatibel mit dem "Page Generation Time"-Mod von
## Smartor< smartor_xp@hotmail.com >
## 
#################################################################
## Before Adding This MOD To Your Forum, You Should Back Up All Files Related To This MOD
#################################################################
##
## VERSION HISTORY
##
## v0.1.1 BETA - 2006-02-17
##	- Anzeige der Datei und der Codezeile hinzugefügt
##
## v0.1.0 BETA - 2006-02-16
##	- Start des Mods
##
#################################################################

#
#-----[ OPEN ]------------------------------------------
#
includes/mysql.php

#
#-----[ FIND ]------------------------------------------
#

	//
	// Base query method
	//
	function sql_query($query = "", $transaction = FALSE)
	{


#
#-----[ AFTER, ADD ]------------------------------------------
#

		// SQL-Zeitmessung Anfang
		$zmtime = microtime();
		$zmtime = explode(" ",$zmtime);
		$zmstart = $zmtime[1] + $zmtime[0];
		$abfrage = $query;
		$test = debug_backtrace();
		$this->zmfile .= "xYz" . $test[0]['file'];
		$this->zmline .= "xYz" . $test[0]['line'];
		// SQL-Zeitmessung Ende


#
#-----[ FIND ]------------------------------------------
#
# (in der gleichen Funktion "sql_query")

		if($this->query_result)
		{
			unset($this->row[$this->query_result]);
			unset($this->rowset[$this->query_result]);


#
#-----[ AFTER, ADD ]------------------------------------------
#

		// SQL-Zeitmessung Anfang
		$zmtime = microtime();
		$zmtime = explode(" ",$zmtime);
		$zmende = $zmtime[1] + $zmtime[0];
		$zmtotal = round(($zmende - $zmstart), 5);
		$this->zmtotal += $zmtotal;
		$this->zmteil .= "xYz" . $zmtotal;
		$this->abfrage .= "xYz" . $abfrage;
		// SQL-Zeitmessung Ende


#
#-----[ FIND ]------------------------------------------
#
# (in der gleichen Funktion "sql_query")

			return $this->query_result;
		}
		else
		{


#
#-----[ AFTER, ADD ]------------------------------------------
#

		// SQL-Zeitmessung Anfang
		$zmtime = microtime();
		$zmtime = explode(" ",$zmtime);
		$zmende = $zmtime[1] + $zmtime[0];
		$zmtotal = round(($zmende - $zmstart), 5);
		$this->zmtotal += $zmtotal;
		$this->zmteil .= "xYz" . $zmtotal;
		$this->abfrage .= "xYz" . $abfrage;
		// SQL-Zeitmessung Ende


#
#-----[ OPEN ]------------------------------------------
#
includes/page_tail.php


#
#-----[ FIND ]------------------------------------------
#

exit;
?>


#
#-----[ BEFORE, ADD ]------------------------------------------
#

// SQL-Zeitmessung Anfang
$zm_switch = 1; // 0 = AUS, 1 = EIN
if( ($userdata['session_logged_in']) && ($userdata['user_level'] == ADMIN) && ($zm_switch == 1) )
{
	$zmtotal = $db->zmtotal;
	$abfrage1 = $db->abfrage;
	$abfrage = explode("xYz",$db->abfrage);
	$zmteil = explode("xYz",$db->zmteil);
	$zmfile = explode("xYz",$db->zmfile);
	$zmline = explode("xYz",$db->zmline);
	echo '<div style="font-family: Verdana; font-size: 10px; color: #000000; letter-spacing: -1px" align="center"><br />';

	echo '
	<table width="95%" border="0" cellpadding="1" cellspacing="1" style="border-collapse: collapse font-family: Verdana; font-size: 10px; color: #000000; 

letter-spacing: -1px" >
		<tr>
			<td class="catHead" height="20"><span class="cattitle"><center><b>SQL-Abfrage</b></center></span></td>
			<td class="catHead" height="20"><span class="cattitle"><center><b>Datei</b></center></span></td>
			<td class="catHead" height="20"><span class="cattitle"><center><b>Zeile</b></center></span></td>
			<td class="catHead" height="20"><span class="cattitle"><center><b>Sekunden</b></center></span></td>
		</tr>';

	$co = 1;
	while ($abfrage[$co] <> "")
	{
		echo '<tr><td class="row1">' . $abfrage[$co] . '</td>';
		echo '<td class="row1">' . $zmfile[$co] . '</td>';
		echo '<td class="row1">' . $zmline[$co] . '</td>';
		echo '<td class="row1">' . $zmteil[$co] . '</td></tr>';
		$co++;
	}
	echo '</table><b>Summen:</b><br />Abfragen: ' . ($co - 1) . ' - Gesamte DB-Zeit: ' . $zmtotal . 's</div>';
}
// SQL-Zeitmessung Ende


#
#-----[ SAVE/CLOSE ALL FILES ]------------------------------------------
#

# EoM

Verfasst: 27.09.2006 11:33
von Garfield312
Abgesehen davon, daß in der Anleitung oben die mysql.php wohl im Ordner /db/ zu finden ist und der zweite Teil der Mod-Anleitung für die includes/page_tail.php gedacht sein dürfte :

Läuft dieser Mod bei jemandem ?

Der gibt mir nur aus :
Summen:
Abfragen: 0 - Gesamte DB-Zeit: s
Also überhaupt keine Werte.

Verfasst: 27.09.2006 16:12
von Gumfuzi
klar läuft der (bei mir zB.)

habe den Dateinamen geändert, war falsch, sorry...

Verfasst: 27.09.2006 16:30
von Garfield312
Danke für die schnelle Antwort.

Da mein phpBB mit extrem vielen Mods drin (wohl über 100) an mancher Stelle böse hakt, trotz eigenem Server, hätte mich der Mod schon interessiert.

Hast du irgendeine Idee, warum der bei mir nichts anzeigt ?

Verfasst: 27.09.2006 17:30
von Gumfuzi
mmmmh, blöde Frage:
hast Du es auch in der mysql.php geändert und nicht ev. in der mssql.php etc.? bzw. benutzt Du auch mysql?

Verfasst: 27.09.2006 18:55
von Garfield312
Hundertprozentig MySQL-DB und mysql.php bearbeitet :wink:

Verfasst: 27.09.2006 19:34
von Gumfuzi
kannst Du bitte mal diese 2 Dateien als .txt verlinken?