Chyby, chyby, chybičky

Vývoj každého projektu, ktorý má aspoň trošku "inteligencie" je sprevádzaný chybami. Je to spôsobené hlavne tým, že bežný užívateľ sa vždy správa úplne inak, ako autor projektu naivne predpokladá. Okrem toho vstupuje aj jeden z Murphyho zákonov, tvrdiaci že najnevhodnejšia kombinácia vstupných parametrov nastane vždy v tom najnevhodnejšom čase. (dodnes netuším, ako to ten človek vedel)

Nie je vhodné vypisovať chybové hlášky v stránke, tak ako je to veľakrát štandardom. Nielen že takýto výpis budí dojem amatérskeho spracovania, ale čo je dôležitejšie, zvyšuje riziko nabúrania stránky odsledovaním štruktúry adresárov a premenných (ak nie sú zabezpečené). Teda na sledovanie chýb máme vzásade 3 možnosti

  1. logovať
  2. logovať
  3. ...túto moťnosť už nie je problém domyslieť si

Pre správu chybových hlášok v php stačí definovať funkciu, ktorá sa vyvolá v prípade chyby (alebo warningu) a tá sa má postarať o zalogovanie, čo sa stalo, za akých podmienok a podobne.

function Error($errno, $msg, $file, $line, $vars) {
    ...
}
set_error_handler("Error");
error_reporting(E_ALL);

$errno - číslo chyby
$msg - text chybovej hlášky
$file - názov súboru
$line - číslo riadka

Dôležité je, aby sa vo vnútri funkcie nenachádzal žiaden výpis, ale len zápis chyby do súboru, prípadne zaslanie e-mailu v prípade prvej chyby v danom dni. Takto zabezpečíme, že o každej chybe, prípadne kolízii budeme informovaní a môžeme ju ľahko odstrániť.

Príklad ošetrenia chybových hlášok zápisom do súboru

function Error($errno, $errmsg, $filename, $linenum, $vars) {
    $errorLogFile = 'logs/php_error_'.date('Y-m-d').'.log';
    $maxLogSize = 100; // kB
    $errortype = array (
        1    => 'ERROR',
        2    => 'WARNING',
        4    => 'PARSE ERROR',
        8    => 'NOTICE',
        16   => 'CORE ERROR',
        32   => 'CORE WARNING',
        64   => 'COMPILE ERROR',
        128  => 'COMPILE WARN.',
        256  => 'USER ERROR',
        512  => 'USER WARNING',
        1024 => 'USER NOTICE',
    );

    $logText ='';
    $logText.=date("Y-m-d H:i:s").': '.$_SERVER['HTTP_HOST'].': ';
    $logText.="Error: $errno ";
    $logText.=" ".$errortype[$errno]." ~!~ ";
    $logText.=" ".$errmsg." ~!~ ";
    $logText.='In: "'.$filename.'" ';
    $logText.="(Line: $linenum) ~!~ ";
    $logText.='Lnk:"'.$_SERVER['REQUEST_URI'].'"';
    $fp = fopen($errorLogFile, 'a+');
    fwrite($fp, $logText);
    fclose($fp);
}