Beiträge mit dem Tag firebug

Kleine Helfer beim PHP Debugging

Erstellt von am Sonntag, 24 April, 2011

Beim Erstellen von Anwendungen/Webseiten auf  PHP-Basis ist es recht praktisch, wenn man ohne großen Aufwand an bestimmten Stellen eines Skriptes die Variablen auslesen oder den Inhalt eines Arrays prüfen kann.

Die einfachste Methode dabei wäre natürlich, einfach mit echo $value bzw. print_r($array) den Wert ausgeben zu lassen. Das führt dann allerdings schnell dazu, dass zig echo-Befehle im Quellcode “rumliegen”, die man später wieder entfernen muss. Dazu kommt, dass in jedem Skript die Ausgabe neu definiert werden muss – also auch irgendwo immer Mehrarbeit und Zeitaufwand.

Wer sich ansatzweise auskennt weiß: Oft benötigte Funktionen / Codezeilen lagert man aus und verwendet sie wieder. Nachfolgend kurz meine Methode – die natürlich nicht der Weisheit letzter Schluss ist und auch mal wieder erweitert werden müsste. Wer sie für sich verwenden möchte: Viel Erfolg damit! Wer Anregungen, Ideen, Kritik hat: Her damit! :)

Idee und Umsetzung

Mein Wunsch war, auf jeder Seite meiner Anwendung einen Button zur Verfügung zu haben, über den ich den aktuellen Status/Inhalt von Arrays, Sessions, Konstanten etc. ein- und wieder ausblenden kann. Die Ausgabe sollte in einem extra Layer erfolgen, damit das Layout der Anwendung nicht gestört wird.

Zuerst das Grundgerüst:

<script type="text/javascript">

<!--
function show_hide()	{
	if(document.getElementById("debug").style.visibility == "visible") {
		document.getElementById("debug").style.visibility = "hidden";
	}
	else {
		document.getElementById("debug").style.visibility = "visible";
	}
}
//-->
</script>

<input type="button" value="Debug" onclick="javascript: show_hide();">

<div id="debug" style="position: absolute; top: 35px; left: 10px; min-width: 200px; height: 600px; visibility: hidden; overflow-y: scroll; border: solid 5px #c00; background: #fff; padding: 5px;">
	<table width="100%" style="border-collapse: collapse; background-color: #fff;">
		<tr>
			<td width="100%" style="font-family: consolas; font-size: 80%;">
				<pre>Hier kommt der PHP-Teil rein...</pre>
			</td>
		</tr>
	</table>
</div>

Die Abfrage der Daten in PHP erledigen dann die folgenden Zeilen, diese werden im HTML Grundgerüst zwischen <pre> + </pre> eingefügt.

<?php

$titleStart = '<p style="padding: 5px; background-color: #ccc; border-bottom: solid 3px #39c; font-size: 10pt;">';
$titleEnd = '</p>';

echo $titleStart.'DEBUG-Array-Daten'.$titleEnd;
print_r($debugInfo);
echo $titleStart.'SESSION-Daten'.$titleEnd;
print_r($_SESSION);
echo $titleStart.'GET-Daten'.$titleEnd;
print_r($_GET);
echo $titleStart.'POST-Daten'.$titleEnd;
print_r($_POST);

echo $titleStart.'SERVER[]-Daten'.$titleEnd;
print_r($_SERVER);
echo $titleStart.'ENV[]-Daten'.$titleEnd;
print_r($_ENV);

echo $titleStart.'deklarierte KLASSEN + KLASSENMETHODEN'.$titleEnd;
$arrClasses = get_declared_classes();
foreach($arrClasses AS $nClass) {
	$classList[$nClass] = get_class_methods($nClass);
}
print_r($classList);

echo $titleStart.'FUNKTIONEN'.$titleEnd;
$arrFunctions = get_defined_functions();
print_r($arrFunctions);

echo $titleStart.'KONSTANTEN'.$titleEnd;
$arrConstants = get_defined_constants();
print_r($arrConstants);
?>

Erläuterungen

Im HTML-Teil wird kurz das DIV “debug” mit den notwendigen Positionsangaben versehen. Bei mir soll der EIN-/AUS-Button in der linken oberen Ecke zu sehen sein. Das kleine JavaScript schaltet das DIV dann halt sichtbar oder nicht sichtbar, je nach aktuellem Status.

Das Array $debugInfo fülle ich im Quellcode wo notwendig mit den gewünschten Daten. Das ist zwar auch nicht groß anders, als einfach ein echo zu notieren, allerdings gefällt mir die Ausgabe in dem extra Debug-Layer besser, als wenn das Seitenlayout von der Debug-Ausgabe unterbrochen werden würde.

$_SESSION, $_GET und $_POST liefern die entsprechenden Daten, über $_SERVER und $_ENV hat man auch die Umgebungsvariablen immer im Blick.

Das Array $classList wird über eine Kombination der PHP-Funktionen get_declared_classes() und get_class_methods() befüllt. So lässt sich recht einfach kontrollieren, ob eine selbstdefinierte Klasse initialisiert ist und die enthaltenen Funktionen bereitgestellt wurden.

get_defined_functions() liefert alle zur Laufzeit verfügbaren Funktionen und get_defined_constants() dann logischerweise alle definierten Konstanten.

Einbindung

Damit die anzuzeigenden Daten in jedem Bereich der Anwendung abgerufen werden können, binde ich diese am Ende der index.php der Anwendung vor dem </body> ein – so ist sichergestellt, dass bereits alle Daten geladen wurden. Dazu genügen die folgenden Zeilen:

<?php
	#--> Debugging DIV anzeigen
	include 'debug_info.php';
?>

So sieht’s dann letztlich im Einsatz aus:

Erweiterungsmöglichkeiten

In der aktuellen Form hat das Skript einen Nachteil: es werden ALLE Klassen und Klassenfunktionen angezeigt, ALLE Konstanten, ALLE Funktionen. Die selbstdefinierten Sachen sind dann jeweils am Ende der Liste zu finden, was die Übersicht erschwert.

Das könnte man durch einen Filter umgehen, der eben nur die eigens definierten Klassen, Funktionen etc. darstellt. Die restlichen Werte (Systemstandards, von PHP vordefinierte Klassen, Konstanten etc.) ließen sich optional einblenden.

Optional möchte ich hier auch noch auf die Firefox AddOns Firebug und FirePHP hinweisen. Die Verwendung von FirePHP ist zwar deutlich komplexer, mag aber lohnend sein, sofern man noch mehr Möglichkeiten im Debugging nutzen möchte.

Hilfreiche weiterführende Infos zur Verwendung von FirePHP finden sich etwa bei bueltge, dem WordPress-Gott :) –> FirePHP verwenden, eine Einführung