Autor Zpráva
janbarasek
Profil
Ahoj,
zajímalo by mě, jestli je nějak možné odchytávat PHP errory. Tím myslím to, že by PHP script normálně běžel a když dojde k nějaké chybě nebo PHP_NOTICE, tak by se zavolala mnou definovaná funkce a její parametrem by byl řetězec obsahující text chyby.

Chtěl bych si udělat nějaký nástroj na snadné debugování a nějak nemohu přijít na to, jak by se dalo něco podobného elegantně udělat - resp. jestli je to vůbec možné.

Děkuji za jakoukoli radu.
Alphard
Profil
Viz www.php.net/manual/en/book.errorfunc.php. Nicméně existují i hotové nástroje, třeba Tracy z Nette nevyhovuje?
janbarasek
Profil
Alphard:
Děkuji, letmě jsem na tu stránku nahlédl a myslím, že tam je vše, co hledám.

Nicméně existují i hotové nástroje
V současné době se snažím tlačit výkon svých aplikací na maximum, takže potřebuji mít naprosto kontrolu nad každým řádkem, kde se dá něco ušetřit. Když jsem dělal aplikace s frameworky, tak se obvykle zpomalila až o 15ms, což je pro mě šíleně vysoké číslo. Jsem původně C++ programátor, takže jsem zvyklý na to, že mnoho algoritmů může být opravdu hodně rychlých bez obecných zdržovaček, které frameworky obsahují.


Ještě doplňující otázka:
Našel jsem si tam script, který dokáže odchytit poznámku, vypadá takto:
<?php
echo $a;
print_r(error_get_last());
?>
A jeho výstup je následující:
Array
(
    [type] => 8
    [message] => Undefined variable: a
    [file] => C:\WWW\index.php
    [line] => 2
)
Problém je ale v tom, že vrací jen poznámky a "malé" chyby. Když udělám nějakou fatální chybu - třeba zapomenu středník, tak se nevrací vůbec nic. Lze nějak jednoduše odchytit i fatální chyby, aniž bych se musel dívat do souboru s logem? Myslím že asi ne, protože se script s fatální chybou ihned ukončí, ale radši se ptám.
Luky
Profil
janbarasek:
potřebuji mít naprosto kontrolu nad každým řádkem, kde se dá něco ušetřit
Projdi si každý řádek Tracy, dle mého vkusu ti Alphard neradí vůbec špatně.
Tak jako tak, můžeš najít inspiraci právě třeba tam...
Tori
Profil
janbarasek:
Lze nějak jednoduše odchytit i fatální chyby, aniž bych se musel dívat do souboru s logem?
Dá se nastavit, aby váš vlastní log byl zároveň chybový log serveru.
Jan Tvrdík
Profil
janbarasek:
Lze nějak jednoduše odchytit i fatální chyby
Jednoduše ne, ale toho docílit pomocí register_shutdown_function a error_get_last.

Když jsem dělal aplikace s frameworky, tak se obvykle zpomalila až o 15ms
Jestli tolik řešíš každých 15ms, tak nechápu, proč používáš PHP, které je obecně dost pomalé. I když s HHVM to bude lepší.


janbarasek:
třeba zapomenu středník, tak se nevrací vůbec nic
Jestli máš problém s takhle závažnými chybami, tak bys měl zřejmě úplně změnit styl vývoje. Např. použít IDE nebo začít psát automatické testy.
Joker
Profil
janbarasek:
zajímalo by mě, jestli je nějak možné odchytávat PHP errory.
To už PHP dělá samo od sebe, když je zapnuté logování chyb.

že by PHP script normálně běžel a když dojde k nějaké chybě nebo PHP_NOTICE, tak by se zavolala mnou definovaná funkce a její parametrem by byl řetězec obsahující text chyby.
Pro zajímavost, co pak ta funkce udělá?

V současné době se snažím tlačit výkon svých aplikací na maximum, takže potřebuji mít naprosto kontrolu nad každým řádkem
Nechci nikoho podceňovat, ale z těch co tohle tvrdí většina dokáže sáhodlouze řešit mikrosekundové rozdíly mezi dvěma konstrukcemi, aby jinde spálili půl vteřiny nějakou strašnou prasárnou :-)

Když udělám nějakou fatální chybu - třeba zapomenu středník, tak se nevrací vůbec nic.
Na parse error určitě není možné reagovat v rámci stejného skriptu.
Že syntaktická chyba znamená okamžité ukončení skriptu je nepřesné, syntaktická chyba v první řadě znamená, že to není platný PHP kód, takže to nejde ani spustit a není co ukončit.

Ale skript se syntaktickými chybami by se rozhodně neměl dostat do produkčního prostředí.
janbarasek
Profil
Jan Tvrdík:
Jestli máš problém s takhle závažnými chybami, tak bys měl zřejmě úplně změnit styl vývoje.
Já s tím problém nemám, já píši kód rovnou bez chyb, co nevrací ani poznámky. Jde mi ale o to, že by ten odchytávač měl fungovat, i když selže script. Rád bych totiž udělal nějaké automatické vyhodnocování, jestli náhodou aplikace není poškozena.
Joker
Profil
janbarasek:
Rád bych totiž udělal nějaké automatické vyhodnocování, jestli náhodou aplikace není poškozena.
To by bylo lepší ověřovat třeba hashe souborů.
(Co když aplikace bude poškozena tak, že to nezpůsobí chybovou hlášku?)

Ale jinak PHP umí ověřit syntaxi v souboru přes parametr -l v příkazové řádce.
Píše se tam, že to zjistí jen parse error a ne fatal error, což umí parametr -f, ale ten zase skript i vykoná.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: