tags:

views:

83

answers:

2
+3  Q: 

PHP error wrapper?

I don't know if the term I'm using is right, but what I'm looking for is something similar to what you get with zend server. Take a look at this.

It looks like on an error, it dumps the request along with a stack trace and function parameters as well as some other info. It lets you view it in a nice interface. I know this wouldn't be hard to make myself as you can always do error callbacks, but if something like this exists (for free) I'd prefer to use it instead of reinventing the wheel.

+1  A: 

I do not know of any free tools to parse and display PHP error logs.

I have written logging functions for several projects using set_error_handler() and set_exception_handler().

My handler classes basically do a print_r() of _GET, _POST, _SERVER, _COOKIE, _SESSION, etc and email/SMS me. Works fine most of the time. And I like getting the quick error notifications. (so I can quickly fix it).

You have highlighted a gap in the community tools for PHP. Someone needs to start a project that to log errors with a nice UI for parsing / displaying the logs. Hmm...

Lance Rushing
+2  A: 

I don't don't of any tool that will do that automatically for you ; but it is not hard to develop, I think... Still, I admit, it will take you some time :-(

Just to throw in a few notes, the best solution that comes to my mind to log the errors is :

  • register your own error handler with set_error_handler
  • code the function, so that it logs errors + GET/POST data
    • maybe that could/would/should be done in some kind of database, or structured file (an SQLite Database, maybe : light, fast, easy to use, doesn't depend on an external DB server, ...), and not just plain files ; would be easier to deal with later on.
  • develop the "reporting" application...
    • That's the thing that will take some time, though, as you said...


Using the example that's given on the manual page, something like this would probably do : first, declare your error handling function :

function myErrorHandler($errno, $errstr, $errfile, $errline)
{
    $str = '';
    switch ($errno) {
        case E_USER_ERROR:
            $str .= "<b>My ERROR</b> [$errno] $errstr<br />\n";
            $str .= "  Fatal error on line $errline in file $errfile";
            $str .= ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
            break;
        case E_USER_WARNING:
            $str .= "<b>My WARNING</b> [$errno] $errstr<br />\n";
            break;
        case E_USER_NOTICE:
            $str .= "<b>My NOTICE</b> [$errno] $errstr<br />\n";
            break;
        default:
            $str .= "Unknown error type: [$errno] $errstr<br />\n";
            break;
    }
    $str .= print_r($_GET, true);

    $str .= "\n";
    file_put_contents(dirname(__FILE__) . '/log.txt', $str, FILE_APPEND);

    /* Don't execute PHP internal error handler */
    return true;
}

It gets informations of the error, prepares some specific error messages that depend on the error type, and put all that and a dump of $_GET to a file.
(Of course, your webserver must be able to create / write to that file)


Then, you register that handler :

$old_error_handler = set_error_handler("myErrorHandler");


And, finally, just to test, you trigger some errors :

trigger_error("test of E_USER_ERROR", E_USER_ERROR);
trigger_error("test of E_USER_WARNING", E_USER_WARNING);
trigger_error("test of E_USER_NOTICE", E_USER_NOTICE);


Now, provided you call the page with something like this : http://tests/temp/temp.php?a=10&amp;test=glop&amp;hello=world ; you will get an error log containing this :

$ cat log.txt
<b>My ERROR</b> [256] test of E_USER_ERROR<br />
  Fatal error on line 34 in file /home/squale/developpement/tests/temp/temp.php, PHP 5.3.0RC4 (Linux)<br />
Array
(
    [a] => 10
    [test] => glop
    [hello] => world
)

<b>My WARNING</b> [512] test of E_USER_WARNING<br />
Array
(
    [a] => 10
    [test] => glop
    [hello] => world
)

<b>My NOTICE</b> [1024] test of E_USER_NOTICE<br />
Array
(
    [a] => 10
    [test] => glop
    [hello] => world
)

In this case, it is quite an ugly mess... But you probably see the point ; now, up to you to build upon this to get precisely what you want ;-)


Of course, now, you also have to develop the reporting interface (user-friendly, fast, usable, and all that...) ; this will probably be the longest part to put in place :-(

And, unfortunatly, I do not know any tool that could help you...
(Maybe, if you start developping something, it could be released as open source ? That would probably prove useful to others ;-) I might be interested for some projects, and I am sure I'm not the one ;-) )

Still, have fun !

Pascal MARTIN
+1: very thorough response.
Josh
Thanks :-) (Actually, couple of colleagues and I, at work, thought about the fact that PHP lacks these kind of reporting tool... But, unfortunatly, we didn't have the time to build a nice solution... So we ended up with raw log files containing dumps of data like the example I've reproduced earlier) ; would have been nice to have an existing solution, though ^^
Pascal MARTIN