ugrás a tartalomhoz

Hibanaplózás a háttérben fájlba

Skalár · 2008. Jan. 3. (Cs), 17.51
Hogy lehet azt elérni, hogy ha az oldalamon kapnék egy előre nem látható fatal errort, akkor azt ne a képernyőre, hanem egy log fájlba írja? Nézegetem a manualt, de csak warningra találtam megoldást. Márpedig én hibanaplózni szeretnék, nem a figyelmeztetéseket csak.
 
1

habatűrő kódolás

Szekeres Gergő · 2008. Jan. 3. (Cs), 18.37
a legszebb megoldás, de gondolom ezzel a tanáccsal már elkéstem.

nem írtad milyen szerveren kellene, de apache-ban van error log, az egy txt fájlba írja a php hibákat is.
2

Ha "elöre nem látható fatal_error"...

Ronyn · 2008. Jan. 3. (Cs), 18.42
-al elszál a script,akkor az enyhén szolva tökéletlen.
Másrészt a parse error az asszem mindenképp kijelzöre kerül, a fatal error nem,ha ugy van beállitva,de az sem biztos hogy sikerül naplozni,ha még elötte leáll a script...
Egyébként a set_error_handler() a megoldás,gondolom ezt taáltad Te is...
+html_errors illetve display_errors ini beállitások
+error_reporting()...
+saját hiba jelzésre a trigger_error()...
+manual....
3

display_errors jó lenne

Skalár · 2008. Jan. 4. (P), 08.03
A display_errors = stderr ini alapbeállítás jó lenne, csak egyrészt ahhoz nem férek hozzá, másrészt min. PHP 5.2.4. verzió kell hozzá. Hmm...nekem más elképzelésem volt a hibanaplózásról. Köszönöm a válaszokat.
5

display_errors

Hodicska Gergely · 2008. Jan. 5. (Szo), 14.02
Másrészt a parse error az asszem mindenképp kijelzöre kerül, a fatal error nem,ha ugy van beállitva,de az sem biztos hogy sikerül naplozni,ha még elötte leáll a script...
A display_errors nem tesz különbséget a hibák között.


Üdv,
Felhő
8

Parse

Ronyn · 2008. Jan. 5. (Szo), 21.32
A parse_error-ra nincs hatással a display_errors beállitás,szoval az mindenképp kijelzöre kerül...
9

fogadjunk? ;)

Hodicska Gergely · 2008. Jan. 6. (V), 01.01
Próbáld ki!


Üdv,
Felhő
10

Parse

Ronyn · 2008. Jan. 6. (V), 05.24
Helyesbitek:
Ha a php.ini-ben van eleve beállitva akkor igen,valoban;de ha az adott fájlban akkor nem)))
(én inkább futás közben szoktam beállitani,ezért eleve arra asszociáltam,sajna)
11

nem voltam uriember ;)

Hodicska Gergely · 2008. Jan. 6. (V), 13.23
(Biztosra nem fogadunk.) Tudtam, hogy erre gondolhatsz. Az "adott fájlban van beállítva" az ugye azt jelenti, hogy nincs beállítva. Ezért is jó ha van valami bootstrap fájl (ami indítja az alkalmazást), mert ez többnyire állandó, biztosan nem lesz benne hiba, és itt érdemes az ilyesmiket beállítani.


Üdv,
Felhő
4

log_errors

janoszen · 2008. Jan. 4. (P), 09.23
http://hu2.php.net/manual/en/ref.errorfunc.php#ini.log-errors
6

hozzáférés

Hodicska Gergely · 2008. Jan. 5. (Szo), 14.03
Valszeg ehhez sem fér hozzá.


Üdv,
Felhő
12

Miért ne?

janoszen · 2008. Jan. 6. (V), 16.58
Miért ne férhetne hozzá?

log_errors "0" PHP_INI_ALL
error_log NULL PHP_INI_ALL

Sztem ez a kettő együtt már meg tudja csinálni, amit a kedves kollega kért. És be tudja állítani magának directory szinten. Mindez persze a doksiból idézve persze, nem próbáltam ki.

Normális esetben persze egy rendes hoston lenne, ahol hozzáfér a logjaihoz, mint például <reklám helye>.
7

lehetséges megoldások

Hodicska Gergely · 2008. Jan. 5. (Szo), 14.53
A hiba megjelenítését ugye simán ki tudod kapcsolni a display_errors beállítással. Van egy majdnem kész cikkem hibakezelés témakörében, de úgysem lesz mostanában időm befejzeni, ezért ellövök egy kis puskaport. :)

Saját hibakezelővel elvileg nem tudod elkapni ezeket a hibákat, de azért van pár lehetőség ha abban a fájlban, ami indítja az alklamzásod nincs hiba (ez végül is tartható korlát).

Az egyik lehetőség, hogy regisztrálsz egy shutdown functiont. Ez meghívódik akkor is, ha valamilyen parse, vagy egyéb csúnya hiba van. Sok mindent innen nem fogsz tudni (legalábbis amikor legutóbb néztem, akkor a kimenet már le volt zárva, nem férsz hozzá), de annyit tudsz csinálni, hogy a program belépési pontján beállítod a $fatalError változót true-ra, majd a kilépsi ponton false-ra, és a shutdown functionban pedig ha ennek az értéke true (tehát menetközben megszakadt a pogram futása), akkor dobsz egy levelet Houstonba.

Másik megoldás, hogy egy output buffer kezelőt regisztrálsz. Ez szintén meg fog hívódni akkor is, ha durva hiba volt a kódban. Itt adott esetben annyival járhatsz jobba, hogy megteheted, hogy a displays_error-t bekapcsolva hagyod, és akkor itt a függvényen belül ki tudod parse-olni a szövegből a hibaüzenetket. Ezt meg tudod könnyíteni az error_(append|prepend)_string beállítások segítségével.

Ez utóbbiakra épül egy kicsit perverzebb 3. lehetőség, hogy ezeknek egy olyan JS-t adsz meg, ami utána kliens oldalon postolja el a hibát egy loggoló PHP-nak.


Üdv,
Felhő
13

még a manual is

Skalár · 2008. Jan. 7. (H), 18.30
Reméljük a manual is olvassa majd a cikked, és akkor majd nem produkál ilyeneket, mint most ez itt:
Warning: fsockopen() [function.fsockopen]: unable to connect to www.php.net:80 (Connection timed out) in /var/www/hu.php.net/results.php on line 42
Warning: Cannot modify header information - headers already sent by (output started at /var/www/hu.php.net/results.php:42) in /var/www/hu.php.net/include/layout.inc on line 81
Warning: Cannot modify header information - headers already sent by (output started at /var/www/hu.php.net/results.php:42) in /var/www/hu.php.net/include/layout.inc on line 82