PHP hiba linkelése az editorra

Gondoltam egyet még régebben, hogy milyen jó lenne, ha a PHP hibaüzenetek linkelve lennének a megfelelő helyre és erre kattintva megnyílna az editor a hibás sorra poziciónálva.

Nézzük lépésenként mire lesz szükségünk:

  • létre kell hoznunk a registryben egy “editor” protocollt (lehet más a neve)
  • készítenünk kell a fenti protocollhoz egy .bat filet
  • módosítani kell a megfelelő helyeken a PHP kódunkat

A registryben az alábbi könyvátstruktúrát kell bejegyezni és a commandnál a batch file hivatkozást megadni:

  1. shell
  2.  open
  3.   command
  4.    (Default) = c:\editor.bat %1

A batch fileban figyelni kell az útvonal megadására (szóközök esetén idézőjelbe), illetve az editorunk dokumentációjából ki kell keresni, hogy hogyan lehet parancssorból futtatva filenevet és sor pozicionálást átadni:

  1. for /f "tokens=1,2,3* delims=:" %%i in ("%1") do start c:\"path to"\"editor dir"\editor.exe -pozicionalas %%l "%%j:%%k"

PHP-ban a saját hibakezelőbe kell beépíteni a lenti kódot. Két konstansra lesz szükségünk (EDITOR_*) az egyikkel ki/be kapcsolhatjuk a működést a másikkal megadjuk azt az útvonalat ahol a file elérhető. A “getdbtrinfo()” a normál “debug_backtrace()” kimenetén megy végig és linkeli a sorszámokat a böngésző számára:

  1. // szukseges konstansok - configba
  2. define(‘NL’,            "\n");
  3. define(‘EDITOR_LINK’,   TRUE);
  4. define(‘EDITOR_PREFIX’‘W:\\path\\to\\web\\root’);
  5.  
  6. // sajat debug backtrace kimenet
  7. function getdbtrinfo()
  8. {
  9.     if (PHPVERSION() >= 4.3) return;
  10.     $tmp = debug_backtrace();
  11.     $info = $_SERVER[‘REQUEST_URI’].‘ - ‘.$_SERVER[‘QUERY_STRING’].‘ - ‘.date(‘Y.m.d. H:i:s’, time()).NL;
  12.     foreach ($tmp as $d) {
  13.         $line = ;
  14.         if (isset($d[‘line’])) $line = ‘#’.$d[‘line’];
  15.  
  16.         if (isset($d[‘file’]) && $d[‘file’]) {
  17.             $pos = strpos($d[‘file’], $_SERVER[‘SERVER_NAME’]) + strlen($_SERVER[‘SERVER_NAME’]);
  18.             $file = substr($d[‘file’], $pos);
  19.             $info .= $file.‘ ‘;
  20.             if ($d[‘line’] && defined(‘EDITOR_LINK’) && EDITOR_LINK) {
  21.                 $line = ‘<a href="editor:’.EDITOR_PREFIX.$file.‘:’.$d[‘line’].‘">’.$line.‘</a>’;
  22.             }
  23.         }
  24.         $info .= (isset($d[‘line’]) ? $line.‘ - ‘ : );
  25.         $info .= (isset($d[‘class’]) ? $d[‘class’].‘->’ : );
  26.         $info .= $d[‘function’].NL;
  27.     }
  28.     return $info;
  29. }
  30.  
  31. // sajat hibakezelo
  32. function ErrorHandler($errno, $errmsg, $filename, $linenum, $vars)
  33. {
  34.     // … saját kód
  35.     echo ‘<pre>’;
  36.     $msg = getdbtrinfo();
  37.     $linemsg = ‘<b>’.$linenum.‘</b>’;
  38.     if ($linenum && defined(‘EDITOR_LINK’) && EDITOR_LINK) {
  39.         $pos = strpos($filename, $_SERVER[‘SERVER_NAME’]) + strlen($_SERVER[‘SERVER_NAME’]);
  40.         $file = substr($filename, $pos);
  41.         $linemsg = ‘<a href="editor:’.EDITOR_PREFIX.$file.‘:’.$linenum.‘">’.$linenum.‘</a>’;
  42.     }
  43.     $msg .=
  44. .$errmsg.‘ in <b>’.$filename.‘</b> on line ‘.$linemsg.‘<hr/> ‘;
  45.     echo $msg;
  46.     echo ‘< /pre>’; // itt azert van szokoz mert a code highlighter megfekudt tole
  47.     // … saját kód
  48. }
  49.  
  50. set_error_handler(‘ErrorHandler’);

A PHP kód 46. sorában azért van szóköz a < /pre> előtt mert egyébként megfeküdt tőle a kód highlighter.

1 megjegyzés »

  1. FelhőBácsi

    # 2007. július 4., szerda - 13:18 · válasz erre

    Annó ezt megcsináltam jEditre vonatkozóan. Hasznos tudott lenni.

    Üdv,
    Felhő

RSS hírcsatorna a bejegyzéshez kapcsolódó véleményekről. · Visszakövetés

Mondd el a véleményedet!