Debuggen met FirePHP
Iedere zelfrespecterende webdeveloper kent Firebug, de irritatie van het debuggen met alert() en wat voor een verademing console.log is. Echter, wanneer we met PHP bezig zijn hebben we nog vaak de neiging om PHP's gelijke aan Javascript alerts te gebruiken voor debuggen: echo en var_dump(). Vaak werkt het wel, maar het sloopt ook vaak je layout en soms daardoor frontend functionaliteit.
Er zijn verschillende andere manieren om je PHP code te debuggen en een daarvan is FirePHP.
Zoals je weet heeft Firefox een extensie systeem, maar ook Firebug zelf heeft een extensie systeem. Hiermee kun je extra tabbladen toevoegen aan Firebug en gebruik maken van alle faciliteiten die Firebug biedt. Voorbeelden van handige Firebug extensies zijn YSlow, Firecookie en ook FirePHP. Een compleet overzicht van handige Firebug extensies vind je in Scriptorama's browser developer tools overzicht.
Wat is FirePHP?
FirePHP is een Firebug extensie waarmee je vanuit je PHP script verschillende soorten debug-berichten kunt sturen naar de Firebug console in Firefox. Denk bijvoorbeeld aan foutmeldingen, debug berichten of verzamelingen van debug informatie.
Al de verschillende soorten debug berichten, zoals simpele logmessages, variabele dumps, complete tabellen en stacktraces, zijn te versturen via een simpele PHP API die met de FirePHP extensie in Firebug kan communiceren. FirePHP doet dat door slim gebruik te maken van output buffering en HTTP headers.
Hoe kan je FirePHP gebruiken?
Allereerst zul je uiteraard de FirePHP extensie moeten installeren. Dit kun je via addons.mozilla.org doen of via de site van de ontwikkelaar. Op deze site staat ook de library FirePHPCore om de debug-berichten vanuit PHP naar FirePHP te sturen.
Vervolgens include je de PHP library zodat je de FirePHP class en de shortcut FB class kunt gebruiken. Vanwege de manier waarop FirePHP z'n debug informatie naar de browser stuurt is het ook belangrijk om er voor te zorgen dat output buffering geactiveerd staat. Dit kun je doen met ofwel de ob_start() functie of globaler met de output_buffering php.ini optie. Zorg wel, dat als je ob_start() gebruikt, dat dit gebeurd voordat je output verstuurt naar de browser.
-
require TOOLS_PATH . 'FirePHPCore/fb.php';
Nu kun je alle functionaliteit die FirePHP aanbiedt direct gebruiken. De FirePHP API bestaat uit twee klassen: de instantieerbare FirePHP klasse en de statisch aanroepbare wrapper: FB. De eerste gebruik je voornamelijk op het moment dat je de FirePHP library wilt configureren, de tweede gebruik je om overal zonder moeite de FirePHP API te kunnen aanspreken.
Het complete overzicht van beschikbare functies vind je in de handleiding van FirePHP, maar hier zijn enkele interessante functies waar je direct mee aan de slag kunt:
Stuur simpele log berichten naar FirePHP
Firebug's console heeft 4 soorten log messages: log, info, warn en error. Deze verschillende types kun je ook met FirePHP gebruiken:
-
FB::info('Dit is een info message');
-
FB::warn('Dit is een warn message');
-
FB::error('Dit is een error message');
Deze messages krijgen elk hun eigen markering in de Firebug console:

Stuur variabelen naar FirePHP
FB::log() kan meer dan alleen maar een simpele string met informatie loggen. Op het moment dat je FB::log() gebruikt om een complexere variabele te tonen, toont FirePHP deze met zijn eigen Variabele Inspector:
De verschillende elementen van de array zijn inklapbaar wat deze functionaliteit erg nuttig maakt voor het doorspitten van grotere data structuren.

Stuur een tabel van gegevens naar FirePHP
Doorsturen van foutmeldingen is één ding, maar je kunt natuurlijk ook verschillende stukken informatie verzamelen tijdens de runtime van je webapplicatie en deze uiteindelijk tonen. Denk bijvoorbeeld aan een overzicht van de 3 traagste of alle SQL queries. Hiervoor kun je de tabel vorm van FirePHP gebruiken:
-
/* Deze array genereer je uiteraard normaliter zelf ergens vanuit je applicatie :) */
-
array('0.25', 'SELECT * FROM Users INNER JOIN UserGroups ON (User.UserGroupID = UserGroup.GroupID'),
-
);
-
-
FB::Table ( 'De 3 traagste SQL queries', $sqlQueries );
Deze array levert FirePHP in een keurige tabel aan, in de Firebug Console:

Stuur een stacktrace naar PHP
In sommige situaties is niet helemaal duidelijk hoe een stuk code nou in een bepaalde functie terecht is gekomen. In Stacktraces met PHP heb ik daar al eerder eens wat over geschreven. Met de Trace functionaliteit maakt FirePHP het opvragen en bekijken van stacktraces nog een beetje makkelijker:
-
FB::Trace();
In deze stacktrace zijn de verschillende variabelen die gebruikt worden in de verschillende aanroepen klikbaar en deze openen de variabele inspector die we al eerder tegenkwamen.

Stuur PHP errors en niet opgevangen excepties direct door naar FirePHP
Je kunt er voor kiezen om al je errors en E_NOTICE meldingen gewoon tussen je HTML te laten tonen, je moet ze toch oplossen, maar je kunt er ook voor kiezen om deze in de Firebug console te laten tonen, en dat is toch net even overzichtelijker. Om dit te bewerkstelligen zullen we een FirePHP object moeten opvragen en vervolgens configureren:
-
$fb = FirePHP::getInstance(true);
-
$fb->registerErrorHandler();
-
$fb->registerExceptionHandler();
-
-
//voorbeeld foutje
-
$array = NULL;
-
Hierna zullen alle errors die normaal door de standaard error handler getoond zouden worden via FirePHP getoond worden. Uiteraard toont dit alleen de foutmeldingen die PHP kan opvangen met zijn error handler. Syntax fouten en fatal errors zullen dus gewoon op de zelfde manier getoond blijven worden.

Conclusie
Het is nog geen interactieve debugger, maar FirePHP is zeker the next-best thing. Met FirePHP kan je het debuggen, maar ook het loggen van runtime informatie zoals bijvoorbeeld performance statistieken van een webapplicatie een behoorlijk stuk makkelijker en leuker maken.
Volg Scriptorama via RSS!
Reageer ook!
Thanks, erg handig en bruikbaar artikel! :-)
Door Joost van Velzen
op 12.02.08 @ 10:42 am | Permalink
Zeer duidelijk en simpel uitgelegd. Thx!
Door Stijn Janssen
op 12.02.08 @ 11:43 am | Permalink
Ik heb een aantal testjes uitgevoerd en het werkt op zich vrij goed :)
Door Max
op 12.02.08 @ 2:46 pm | Permalink
Ik gebruik FirePHP al een tijdje en het werkt erg goed. Groot voordeel is dat het ook werkt met Ajax en page-redirects. Overigens wordt nu hard gewerkt om deze techniek ook voor andere talen (bijvoorbeeld Java) geschikt te maken. Zeker aan te raden.
Door Edwin Martin
op 12.02.08 @ 9:59 pm | Permalink
Goed artikel!
Wanneer je veel gebruik maakt van Exception handling is het handig om firePHP te gebruiken bij het afvangen van de fouten. Op deze manier komen de opgeworpen exceptions direct terug in Firebug.
Door Willem
op 12.05.08 @ 11:50 am | Permalink
Al een tijdje zit er een Zend_Wildfire component in het Zend Framework. Wildfire is eigenlijk het concept erachter, FirePHP is de naam van de Firebug extensie bij gebruik met PHP. Wildfire beschrijft communicatie tussen een server-side taal en de browser hiervoor.
Over het Zend component, deze is erg gemakkelijk om te gebruiken met Zend_Log of de database profiler.
Door Kokx
op 12.24.08 @ 11:55 pm | Permalink
Hartstikke bedankt voor dit heldere artikel. Ik kon er in no-time mee aan de slag.
Dit is zoveel fijner dan steeds phperror.log bekijken!
Door Jan
op 07.04.09 @ 4:47 pm | Permalink
Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>