Ladění php skriptů, díky za magické konstanty

Jak ladíte php skripty? Já používám magické konstanty (magic constants), podle mne je to nedocenitelná věc. Napsal jsem si na to vlastní třídu, posuďte sami.


Zdrojový kód ke stažení example8.zipUkázky k nahlédnutí debugging.php.

Nikdo není neomylný, ani samotní tvůrci PHP, spíše naopak, a proto je nutné čas od času zjistit, kde je chyba. Určitě jste si už častokrát položily otázku: K čertu, proč se to chová takhle? To přece musí fungovat. Použil jsem mírný slovník, obvykle proklínám všechny svaté od Zendu až po velkého Billa.

Každý má svou metodu jak odhalit chyby. Někteří si vystačí s příkazem echo, jiní používají print_r.

  1. <?
  2. function tricky() {
  3. ...
  4. echo "řádek po řádku zkouším kde mi to kixne";
  5. ...
  6. }
  7. $a=new TrickyClass();
  8. print_r($a);
  9. ?>

Při objektově orientovaném programování jsou tyto funkce obvykle nedostatečné. Zvlášť když jsou jednotlivé metody volány v řetězci. Pak je to jak hra na honěnou.

Na řadu přichází magické konstanty, ty nás informují o tom na jakém řádku se právě nacházíme, ve kterém souboru, funkci, třídě nebo metodě. Vypadají následovně __LINE__, __FILE__, __CLASS__, __METHOD__, __FUNCTION__.

Vytvořil jsem si na to vlastní třídu, implementuje i použití print_r ;-), funguje tak, že v místě, kde chci sledovat nějaké chování skriptu, volám příkaz Debug::msg("nějaký message třeba hodnota sledované proměnné");, případně volám Debug::msgn("message");, která vypíše výsledek rovnou na obrazovku.

Třída uchovává čas spuštění, pořadí hlášky, magické konstanty a využívá příkaz debug_backtrace(), který trasuje posloupnost funkcí vedoucí na aktuální místo. V neposlední řadě můžeme sledovat aktuální využití paměti, které je defaultně vypnuté, ale lze ho zapnout voláním funkce Debug::logMemory();, někde na začátku skriptu, stačí spustit jednou. Tato vlastnost je defaultně vypnuta ze dvou důvodů. Prvním je absence vestavěné funkce memory_get_usage() ve starších verzích < PHP 5.2.5 ve windows. Tento nedostatek můžete odstranit po přečtení článku Zjištění zabrané paměti php skriptem ve Windows. Druhým problémem je náročnost této funkce, hlavně co se týče windows, pak by samotné provádění debugu mohlo způsobit nestandardní nebo závadné chování skriptu. V příkladu je mimo jiné použit článek Nedocenitelná funkce __autoload.

Stejně jako sledování paměti můžete vypnout zmíněný debug_backtrace(), ne vždy je potřeba a jeho výpis může být chaotický. Použitím Debug::logBacktrace(0); je vypnut, opět někde na začátku skriptu.

Není od věci doprogramovat různé reporty do souboru, mailu, xml, ukládání do session nebo další výpočty času mezi jednotlivými operacemi apod.

podobné články

19.06.2010elFinder open-source FileManager/FileBrowser/ImageBrowser stojí za to!(8%)
27.06.2008CURL, jak načíst obsah url, když nefunguje file_get_contents(8%)