Přejít k navigační liště

Zdroják » PHP » Snazší ladění AJAXových aplikací s FirePHP

Snazší ladění AJAXových aplikací s FirePHP

Články PHP, Různé

Vývoj AJAXových aplikací přináší PHP programátorům nové výzvy. Tou asi nejdůležitější, s níž se programátoři potýkají nejvíc, je debugování skriptů, jejichž výstup „není vidět“. Řešit to lze různě, více či méně elegantně. Jedním z nejelegantnějších řešení, alespoň pro ty, co používají Firefox, je FirePHP.

Při ladění AJAXových aplikací se každému programátorovi dřív nebo později stane, že skript, který by měl poslat data, z nějakého důvodu nefunguje. Jak zjistit, kde je problém?

Klasický postup s ladicími výpisy a s logy není u AJAXových požadavků příliš vhodný – jejich výsledek většinou není nikde vidět a případný výpis je třeba zařizovat na straně klienta – ladicím výpisem v JavaScriptu. Vypisování všeho do logovacího souboru a následné prolézání a hledání jehel v kupě sena není vždy to pravé ořechové.

Nejčistším řešením je použít vývojové prostředí, které integruje i PHP debugger, a s jeho pomocí najít chybu klasickým způsobem – krokováním, trasováním, výpisem hodnot… Jenže podobné řešení nemusí být vždy po ruce a dobře použitelné – někdy se chyba objeví jen při určité kombinaci parametrů, které odchytit pomocí breakpointu není triviální.

Jako „střední cesta“ se nabízí FirePHP: Rozšíření, které umožní předat chybové výpisy z PHP do prohlížeče „postranním kanálem“ spolu s odpovědí na AJAXový požadavek.

FirePHP

FirePHP je rozšíření pro známý ladicí nástroj Firebug – rozšíření Firefoxu, které umožňuje ladit skripty, procházet DOM strom a upravovat atributy prvků přímo v „živé“ stránce. Čtenářům Zdrojáku pravděpodobně není potřeba toto rozšíření představovat.

FirePHP přidává možnost poslat chybové hlášení či ladicí výpis z PHP v hlavičkách odpovědi. Na klientské straně tyto hlavičky zachytí a hlášení zobrazí v konzoli Firebugu. Skládá se ze dvou částí – z rozšíření pro Firebug a z malé knihovny pro PHP.

Instalace a použití FirePHP je snadné – vše je dobře zdokumentované a celá instalace spočívá pouze v instalaci výše zmíněného rozšíření a začlenění PHP knihovny do projektu.

Pokud používáte některý PHP framework, je pravděpodobné, že má podporu FirePHP zabudovánu. Na stránkách FirePHP jsou uvedeny následující frameworky a nástroje: Agavi, BIGACE, CakePHP, CodeIgniter, Drupal, ExpressionEngine, eZ, Joomla, Kohana, Nette Framework, PEAR, PRADO, Probus, Project Zero, REDAXO, Seagull, Smarty, Solar, Symfony, TYPO3, WordPress a ZenMagick – s upozorněním, že to nejsou zdaleka všechny. Většina frameworků používá FirePHP ve svých rutinách pro obsluhu výjimek a chyb, takže se nemusíte o nic starat a framework vám doručí chybové hlášení až do konzole „sám od sebe“, bude stačit pouze doinstalovat FirePHP, resp. Firebug.

FirePHP demo

Použití FirePHP

Po instalaci potřebných nástrojů stačí na vhodném místě použít include(„fb.php“). Tím je FirePHP povolen a můžeme začít posílat hlášení:

FB::log('Zpráva do konzole...');

FirePHP demo 1

Tato jednoduchá funkce umožňuje nahradit běžně používanou metodu ladicích výpisů pomocí print_r nebo var_dump. Můžeme tak do kódu vložit na určitá místa testovací výpisy, které na rozdíl od předchozích metod nezasahují do vygenerovaného kódu (jsou předány, jak jsme si řekli, postranním kanálem – v hlavičkách).

Důležité je, a stránky FirePHP na to výslovně upozorňují, nezapomenout tyto výpisy odstranit před nahráním na veřejný server – přece jen: ladicí výpisy obsahují dost často citlivé informace. Pokud z nejrůznějších důvodů nechcete nebo nemůžete hlášení odstranit, můžete na serveru zakázat FirePHP pomocí

FB::setEnabled(false);

Kvůli kompatibilitě s různými verzemi PHP a různými programátorskými přístupy nabízí FirePHP nejen statické metody, ale i metody singletonu FirePHP:

$firephp = FirePHP::getInstance(true);
$firephp->log("Zpráva do konzole");

Můžete použít i klasický neobjektový procedurální přístup – pomocí funkce fb(). Zájemce o bližší informace odkážu na dokumentaci.

Protože FirePHP posílá informace v hlavičkách, může nastat problém – zejména v případě, když skript posílá data průběžně. V takovém případě je nutné použít bufferování výstupu pomocí ob_start().

Aby bylo snazší od sebe jednotlivá hlášení odlišit, nabízí FirePHP kromě metody log i metody info, warn a error – jejich význam snad není třeba vysvětlovat.

FirePHP demo 2

FirePHP se neomezuje jen na prostá textová hlášení – umí třeba i vypsat tabulku pomocí FB::table

$table   = array();
$table[] = array('Sloupec 1','Sloupec 2');
$table[] = array('Řádek 1 sloupec 1','Řádek 1 sloupec 2');
$table[] = array('Řádek 2 sloupec 1','Řádek 2 sloupec 2');
$table[] = array('Řádek 3 sloupec 1','Řádek 3 sloupec 2');
 
FB::table('Hlášení jako tabulka', $table);

FirePHP demo 3

Další možnosti FirePHP

Umět vypsat text do konzole, byť jakkoli zajímavě, je sice hezké, ale poněkud nepohodlné. FirePHP umí celkem jednoduchým způsobem zapnout logování chyb, výjimek a assertů. Jednoduchý příklad vše osvětlí:

//Zísláme instanci singletonu FirePHP
$firephp = FirePHP::getInstance(true);

//Zapneme zachytávání chyb
$firephp->registerErrorHandler(0);

//... a vygenerujeme chybu - omlouvám se, zajímavější mě nenapadla.
echo 0/0;

FirePHP demo 4

Obdobně FirePHP nabízí i funkce registerExcep­tionHandler() a registerAsser­tionHandler(), které zachytávají, jak už názvy napovídají, výjimky a asserty.

Pokud chceme vědět, kudy skript chodí, než vypíše co vypsat má, můžeme si na klíčová místa vložit volání metody FB::trace – hlášení se pak objeví v konzoli, kde si je můžeme rozbalit a zjistit, na jakém řádku bylo hlášení vyvoláno.

Závěr

FirePHP je neocenitelný pomocník pro vývojáře webových aplikací – výrazně usnadňuje vývoj a ladění aplikace, včetně ladění dotazů, jejichž výsledky nejsou vidět, bez nutnosti měnit nějak JS kód, a přitom je jeho použití snazší než použití PHP debuggeru.

Tvůrci FirePHP připravují novou verzi („FirePHP 1.0“) pod názvem FireConsole. Tato verze je kompletně přepracovaná a využívá možností, které nabízí Firefox 3.5+ a Firebug 1.5+ Je postavena na technologiích narwhalrunner, narwhal-xulrunner, narwhal a CommonJS. FireConsole je v raném stádiu vývoje a zatím není k dispozici.

Komentáře

Subscribe
Upozornit na
guest
4 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
View all comments
Darwin

Spachal jsem podobny projekt pro Python a pak ho portnul i pro PHP.

http://firelogger.binaryage.com/php

V cem je FireLogger lepsi? Je spis pro javascript programatory, kteri se spini s PHPkem. flog(…) funguje stejne jako v console.log v javascriptu, tedy co do ni posles, to z ni ve firebugu vypadne a je to rozkliknutelny v DOM inspektoru.

:-)

Pěkný, jednoduchý, zajímavý.

Patrik Votoček

K dispozici je Alpha http://www.fireconsole.org/Alpha/

norbertlaposa

Děkuji za tento článek. Notnou dobu jsem vnímal FirePHP a stále jsem neměl pocit, že by to bylo něco, co má smysl implementovat. Avšak tento članek mě přehoupl přes pomyslnou váhu a FirePHP skrze Zend_Log se dostal do mého frameworku natrvalo.

Enum a statická analýza kódu

Mám jednu univerzální radu pro začínající programátorty. V učení sice neexistují rychlé zkratky, ovšem tuhle radu můžete snadno začít používat a zrychlit tak tempo učení. Tou tajemnou ingrediencí je statická analýza kódu. Ukážeme si to na příkladu enum.

Pocta C64

Za prvopočátek své programátorské kariéry vděčím počítači Commodore 64. Tehdy jsem genialitu návrhu nemohl docenit. Dnes dokážu lehce nahlédnout pod pokličku. Chtěl bych se o to s vámi podělit a vzdát mu hold.