The Joy of FirePHP een spoedcursus

FirePHP is een Firefox-plug-in en een server-side bibliotheekcombinatie waarmee u allerlei sappige informatie uit uw webtoepassing naar uw browser kunt verzenden, net als de console.log () -functionaliteit met JavaScript. In deze PLUS zelfstudie en begeleidende screencast leren we u vanaf het allereerste begin aan de slag te gaan!

Deze tutorial bevat een screencast die beschikbaar is voor leden van Tuts + Premium.

Dus je denkt dat je een geweldige webontwikkelaar bent, toch? Lees niet verder totdat je de eerste uitdaging hebt doorstaan: beantwoord (eerlijk) "waar" of "onjuist" over jezelf aan de volgende uitspraken:

  1. U gebruikt Firefox voor webontwikkeling
  2. U hebt de beroemde Firebug-extensie geïnstalleerd
  3. Je ontwikkelt in PHP

Als je ze alle drie hebt beantwoord met een klinkend 'waar', geef jezelf dan een schouderklopje. Ik vergeef je dat je nummer drie niet krijgt, maar als je Firefox niet gebruikt met Firebug ... waar ben je geweest!?

Je hebt deze winnende combo nodig om deze tutorial te voltooien. Het laatste wat je nodig hebt - om die grootmeester, uber-ontwikkelaar, codedoder van je dromen te worden - is het belangrijkste onderdeel: FirePHP.


Wat is FirePHP?

FirePHP is een Firefox-plug-in en een server-side bibliotheekcombinatie waarmee u allerlei sappige informatie uit uw webapp kunt versturen naar uw browser, op een mooiere manier dan de gebruikelijke:

 echo $ variabele;

Deze code is zo gewoon. Soms lijkt het de snelste manier om de waarde van $ variable dus je weet wat het is op een bepaald moment van code-uitvoering.

Maar wat als $ variable is geen string of een integer; wat als het een complex datatype is zoals een array of een object? In PHP zou de bovenstaande code niet zo nuttig zijn:


"Gebruik gewoon print_r ($ variable);" Ik hoor je zeggen. Oké slimme broek, maar dat is niet erg elegant. Proberen de waarde van een array-item in die rommel te vinden, is lastig. En het sorteert nog steeds geen objecten!

Als je ziet wat FirePHP kan doen, verander je van gedachten! Het maakt debuggen tot een verrassend aangenaam proces en resulteert in veel meer draagbare code.

In deze zelfstudie laat ik je zien hoe je FirePHP kunt instellen in je app en een aantal geweldige manieren om het te gebruiken om de ontwikkeling en debugging te versnellen.


Stap 1: de serverkant instellen

Als u de FirePHP-extensie niet hebt geïnstalleerd, installeert u deze nu.

De FirePHP-extensie (die ik vanaf nu FirePHP zal noemen) is volledig afhankelijk van Firebug, dus dat heb je ook nodig. De klassen aan de serverzijde (die ik FirePHPCore zal noemen) zijn beschikbaar als een op zichzelf staande bibliotheek. Er zijn ook een aantal plug-ins voor de populaire PHP-frameworks en CMS's.

Simon zegt:

Hoewel de naam anders doet vermoeden, is FirePHP niet alleen voor PHP-ontwikkelaars. Het gebruikt zijn eigen set HTTP-headers om informatie uit uw toepassing naar de browser te sturen, zodat het gemakkelijk kan worden geporteerd naar andere talen. Er zijn bibliotheken aan de server beschikbaar voor ASP, Ruby, Python en meer. Als er geen taal voor jouw taal is, kun je jezelf altijd uitdagen en zelf schrijven.

Dit maakt het ook ideaal voor AJAX-foutopsporing, omdat asynchrone reacties zuivere inhoud zijn die alleen de uitvoer bevat die u wilt zien - niet de foutopsporingscode.

Ga je gang en download je favoriete server-side bibliotheek. In deze tutorial zal ik me concentreren op het gebruik van de standalone core library. Instructies voor het instellen van andere bibliotheken zijn te vinden op de FirePHP-wiki.

Simon zegt:

Als u een PEAR-configuratie hebt en dat liever gebruikt, typt u de volgende twee regels op de opdrachtregel:

 pear channel-discover pear.firephp.org pear installeer firephp / FirePHPCore

Nadat u het pakket hebt uitgepakt, gaat u naar lib map en kopieer de FirePHPCore map naar uw webserver of app inclusief map.


Companion Screencast


Simon zegt:

Een van de geweldige dingen over de stand-alone FirePHPCore is de ondersteuning voor PHP4. Dus je kunt het zelfs aansluiten op een aantal van die retro-sites die je nog steeds gebruikt!


Stap 2: Hallo, FirePHP

Zoals met alle goede codeerinstructies, zullen we beginnen met een eenvoudig voorbeeld, de "Hello, World" van FirePHP.

Maak een nieuw, leeg PHP-document. Ik zal de mijne bellen test.php. Sla het op in de hoofdmap van uw app.

Om FirePHPCore zijn werk te laten doen, moeten we uitvoerbuffering mogelijk maken. Lees hier meer over als je het nog niet eerder hebt gebruikt, het is een goede gewoonte om toch door te gaan.

 

Natuurlijk moeten we niet vergeten om de FirePHPCore-bibliotheek op te nemen. Als je PHP5 gebruikt, voeg je dit toe aan de bovenkant van het bestand:

 include_once ('includes / FirePHPCore / fb.php');

Als u PHP4 gebruikt, neemt u de fb.php4 bestand in plaats daarvan.

Simon zegt:

We hoeven het klassenbestand niet op te nemen, omdat dit deel uitmaakt van het bestand fb.php.

Nu kunnen we beginnen met de uitvoer naar de Firebug-console. Typ het volgende hierna ob_start () en voordien ob_end_flush ():

 FB :: info ('Hallo, FirePHP');

Simon zegt:

FirePHPCore heeft een procedurele en een objectgerichte API. Er is echt geen verschil tussen de twee en je kunt gebruiken wat je wilt.

Het gebruikt ook het singleton-patroon om geheugen te besparen en wordt geleverd met een volledig statische helperklasse, die ik het liefst gebruik omdat het minder codering vereist.

Open Firefox, start Firebug en ga naar deze pagina. Je zou zoiets als dit moeten krijgen:


Hoe cool is dat!? Nou, dat is geen erg opwindende demo, dus laten we iets ingewikkelder proberen.


Stap 3: Complexe variabelen verzenden

Laten we eens kijken wat er gebeurt als we een complexe variabele doorgeven. We zullen een array maken en kijken wat we krijgen. Voeg de volgende code toe net na de laatste FB :: info () aanroep:

 $ array ['key1'] = 'sommige inhoud'; $ array ['anotherKey'] [] = 1234; $ array ['anotherKey'] [] = 5678; $ array ['anotherKey'] [] = 9012; $ array [] = null; FB :: info ($ array, 'My Array Test');

Nu opslaan, ga naar Firefox en vernieuwen.


Ok, ziet er goed uit ... maar wacht even, waar is alle output? Beweeg uw cursor over die nieuwe lijn.


Wauw. Het Firebug-frame toont ons alle gegevens in onze array - niet alleen array-elementen op het eerste niveau, maar ook op een lager niveau - en op een nette, leesbare manier.

Het wordt nog interessanter met objecten! FirePHPCore maakt volledig gebruik van reflectie om de eigenschappen van een object te inspecteren - zelfs privéeigenschappen.

Simon zegt:

FirePHPCore heeft een aantal opties die kunnen worden ingesteld om het inspectieniveau in arrays en objecten te beperken. U kunt zelfs een filter maken voor objecteigenschappen waarvan u niet wilt dat deze worden doorgegeven aan de user-agent.

U kunt meer informatie vinden over de FirePHPCore API op het FirePHP-hoofdkantoor.


Praktisch gebruik

Het zou u al duidelijk moeten zijn dat dit kan helpen bij algemene foutopsporing, maar nu ga ik kijken naar enkele inventieve manieren om FirePHP te gebruiken.

1) Een PHP-profileerhulpprogramma

Als u een enkele frontcontroller gebruikt om alle aanvragen voor en bootstrap van uw app te routeren, kunt u de tijd bepalen die elke aanvraag voor uw toepassing kost om op de server te verwerken..

Zoiets zou het doen:

 

Houd er rekening mee dat dit niet alleen een weergave is van de responstijd code uitvoeringstijd - hoe snel uw server de code uitvoert voordat u het naar de user-agent stuurt. De output moet nog steeds van uw server naar de client over het netwerk gaan.

Simon zegt:

U kunt de YSlow-extensie voor Firebug gebruiken om de laadtijden van de algemene pagina en de reactietijd van apps bij te houden.

2) Een eenvoudige SQL Query Inspection Tool

Als u een centrale query-functie gebruikt of een klasse voor databaseconnectoren uitbreidt (zoals mysqli), kunt u een timer rond alle synchrone zoekopdrachten wikkelen en controleren hoe lang elke zoekopdracht duurt.

U kunt ook zelf de SQL-query's noteren. Eigenlijk zou je deze twee stukjes gegevens kunnen samenvoegen. En zou het niet leuk zijn om dat in een goed gestructureerde tabel weer te geven?

Nou Firebug heeft een tabelstructuur en FirePHPCore heeft daar ook een verpakking voor:

 

Simon zegt:

Ik heb hier een paar extra's gegooid. In het bestand myDb.class.php, als de $ result variabele komt terug vals, dit betekent dat deze query is mislukt. Dus ik gebruik het FB :: fout () om dit te markeren als een fout in Firebug en mij de vraag ook te laten zien FB :: trace () om me de processtapel te laten zien die leidde tot de slechte vraag.

Het belangrijkste hier is de FB :: tabel () methode. Dit maakt het maken van gestructureerde foutopsporingsinformatie dood gemakkelijk.

Wanneer u nu uw myDb-klasse instantieert en een query uitvoert, worden de details van die query in een array geplaatst. Vervolgens gebruiken we die array later om onze FirePHP-tabel samen te stellen van alle query's die u voor dat verzoek hebt uitgevoerd, de duur van elke aanvraag en de totale uitvoeringstijd van alle query's..


Wat je hier hebt gedaan, met slechts enkele regels code, zou bij gewoon niet mogelijk zijn geweest echo. Je zou niet verwachten dat iets zo nuttig zou zijn in zo'n korte tijd. Dat zorgt voor snel debuggen.

3) Een AJAX-foutopsporing

Het gebruik van FirePHPCore voor AJAX-verzoeken is niet anders dan het gebruiken voor synchrone verzoeken. Gebruik gewoon de functies zoals u dat normaal zou doen. Wanneer uw app AJAX-aanvragen doet, komt de extra FirePHP-headerinformatie door en verwerkt de clientextensie het naar Firebug's console. Laten we het proberen.

Maak een nieuw bestand met de naam ajax.php in de hoofdmap van uw app. Plaats de volgende code daarin:

 

Nu in jouw test.php bestand, voeg het volgende toe na uw laatste FB :: info () -aanroep:

 ?>     

Verfrissende test.php in Firefox zou je 'Click Me!' Moeten laten zien. knop. Wanneer u erop klikt, moet de browser een AJAX-aanvraag uitvoeren en de reactie (in dit geval platte tekst) laden in de

.


Nog belangrijker is dat FirePHP een nieuw knooppunt toevoegt aan Firebug dat ons alle FirePHP-berichten toont die we hebben ingelogd in het bestand ajax.php.

4) Default Error Handler

Plak dit aan het begin van je app en zelfs vervelende oude PHP-fouten worden naar Firebug gedumpt!

 set_error_handler (myErrorHandler); // Je zou optionele parameters $ errfile, $ errline en $ errcontext kunnen toevoegen voor meer details functie myErrorHandler ($ errno, $ errstr) FB :: error ($ errstr, 'Error number'. $ Errno);  // Doorgaan met normale uitvoering

Dit is een veel schonere en veiligere manier om fouten te melden. Het wordt nog beter als u uw apps demonstreert aan klanten terwijl ze in ontwikkeling zijn (en het risico lopen niet-kritieke fouten te veroorzaken) - als ze geen Firefox gebruiken, met Firebug en FirePHP, zullen ze die afschuwelijke fouten niet zien , maar je zult ... in Firebug. Nooit meer uw foutmeldingsniveaus wijzigen om de zaken netjes te houden! Dat is snellere ontwikkeling.


Veiligheid

Hoewel FirePHP een geweldig hulpmiddel is voor foutopsporing tijdens ontwikkeling en testen, moet het niet worden aangehouden wanneer een app in productie gaat. Het kan mogelijk te veel informatie over uw app onthullen waardoor het leven voor hackers nog gemakkelijker wordt.

Als u via HTTPS verbinding maakt met een site, is uiteraard alle headerinformatie standaard versleuteld. Anders wordt het als platte tekst verzonden.

Het voegt ook een overhead toe aan je app die een ernstige vermindering van de prestaties en een deuk in je bandbreedte kan veroorzaken.

Dit brengt me bij een ander goed punt over FirePHPCore: je kunt de FirePHP-code laten staan, maar het zal geen gegevens verzenden als het is uitgeschakeld of als de verzoekende user-agentstring niet de specifieke FirePHP-referentie bevat.

Als u absoluut FirePHP op productiesites moet inschakelen, bijvoorbeeld voor debuggen op afstand, moet u ervoor zorgen dat het op een schakelaar staat en vergeet niet om het uit te schakelen als u klaar bent. Zoiets als:

 define ('DEBUG_MODE', true); FB :: setEnabled (false); if (DEBUG && $ _SESSION ['userIsAdmin']) FB :: setEnabled (true); 

Dit zorgt ervoor dat, zelfs als uw DEBUG_MODE is ingesteld op 'true' (dus 'aan'), alleen een geverifieerde beheerderssessie met een gebruikersagent met FirePHP de foutopsporingscode activeert en de extra headerinformatie ontvangt.


Conclusie

FirePHP is een briljante tool. Het is perfect geïntegreerd in mijn workflow. Omdat het er altijd is, vastgebout op de gereedschappen die ik al dagelijks gebruik, is het een tweede natuur geworden om te gebruiken.

Wat nog belangrijker is, het heeft mijn huid meer dan een paar keer gered. Ik ben in staat geweest om sites in productie te debuggen zonder de sites te hoeven verwijderen. Het heeft AJAX debugging een zeer reële mogelijkheid gemaakt en omdat het een open-source en gratis te gebruiken is, zijn de kosten van acceptatie extreem laag.

Voeg daarbij het feit dat mijn apps nu meer draagbaar zijn, dat ik er een beter inzicht in heb en ik heb onderweg een paar nieuwe trucs geleerd, wat is er niet leuk aan?

Meer en meer webontwikkelaars gebruiken de browser als hun primaire ontwikkelingshulpmiddel. En waarom niet? Het is waar onze applicaties zijn bedoeld om te werken. Het lijkt dus op de een of andere manier natuurlijker om profilering en debugging in de browser te plaatsen; waar we het meeste van onze tijd besteden aan het debuggen!

Denk dat het tijd is om te stoppen met gebruiken echo nu? Gefeliciteerd Super-Dev!


FirePHP is gemaakt door Christoph Dorn. Versie 0.3.1 is de huidige stabiele versie. De 1.0-versie is in ontwikkeling en belooft een aantal spannende nieuwe functies.