[erledigt] Zeit jeder einzelnen SQL-Abfrage anzeigen lassen

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Benutzeravatar
Gumfuzi
Ehemaliges Teammitglied
Beiträge: 2454
Registriert: 26.03.2004 22:25
Wohnort: Linz, AT
Kontaktdaten:

[erledigt] Zeit jeder einzelnen SQL-Abfrage anzeigen lassen

Beitrag 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.
Zuletzt geändert von Gumfuzi am 17.02.2006 13:03, insgesamt 2-mal geändert.
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Re: Alle DB-Abfragen mitstoppen

Beitrag 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.
KB:knigge
Benutzeravatar
Gumfuzi
Ehemaliges Teammitglied
Beiträge: 2454
Registriert: 26.03.2004 22:25
Wohnort: Linz, AT
Kontaktdaten:

Beitrag von Gumfuzi »

Danke Pyramide!

Klappt wunderbar - werde das gleich dazu einbauen und später mal eine kleine Anleitung dazu posten, falls es jemand braucht.
Benutzeravatar
Gumfuzi
Ehemaliges Teammitglied
Beiträge: 2454
Registriert: 26.03.2004 22:25
Wohnort: Linz, AT
Kontaktdaten:

Beitrag 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
Zuletzt geändert von Gumfuzi am 27.09.2006 19:13, insgesamt 3-mal geändert.
Garfield312
Mitglied
Beiträge: 528
Registriert: 03.09.2004 15:54

Beitrag 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.
Viele Grüße, Garfield.
Benutzeravatar
Gumfuzi
Ehemaliges Teammitglied
Beiträge: 2454
Registriert: 26.03.2004 22:25
Wohnort: Linz, AT
Kontaktdaten:

Beitrag von Gumfuzi »

klar läuft der (bei mir zB.)

habe den Dateinamen geändert, war falsch, sorry...
Garfield312
Mitglied
Beiträge: 528
Registriert: 03.09.2004 15:54

Beitrag 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 ?
Viele Grüße, Garfield.
Benutzeravatar
Gumfuzi
Ehemaliges Teammitglied
Beiträge: 2454
Registriert: 26.03.2004 22:25
Wohnort: Linz, AT
Kontaktdaten:

Beitrag 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?
Garfield312
Mitglied
Beiträge: 528
Registriert: 03.09.2004 15:54

Beitrag von Garfield312 »

Hundertprozentig MySQL-DB und mysql.php bearbeitet :wink:
Viele Grüße, Garfield.
Benutzeravatar
Gumfuzi
Ehemaliges Teammitglied
Beiträge: 2454
Registriert: 26.03.2004 22:25
Wohnort: Linz, AT
Kontaktdaten:

Beitrag von Gumfuzi »

kannst Du bitte mal diese 2 Dateien als .txt verlinken?
Antworten

Zurück zu „Coding & Technik“