The first part of this article demonstrated basic errorhandling in PHP, explaining the various error types and illustrating theprocess of building a custom error handler. But that's just the tip ofthe iceberg - this concluding part goes a step further, showing you totrigger your own errors, and log error messages to a file, database oremail address.
In addition to catching and displaying errors, PHP's error-handling API also allows you to log errors, either to a default error log, to any other file or as an email message.
The error_log() function needs a minimum of two arguments: the error message to be logged, and an integer indicating where the message should be sent. There are three possible integer values in PHP 4.x:
0 - send the message to the system log file (note that you must have logging enabled and a log file specified in your PHP configuration for this to work);
1 - send the message to the specified email address;
3 - send the message to the specified file;
Here's a trivial example which demonstrates how this works:
<?php
// set a variable
$temp = 101.6;
// test it and log an error
// this will only work if
// you have "log_errors" and "error_log" set in your php.ini file if
($temp > 98.6) {
error_log("Body temperature above normal.", 0);
}
?>
Now, if you look at the system log file after running the
script, you'll see something like this:
[28-Feb-2002 15:50:49] Body temperature above normal.
You can also write the error message to a file,
<?php
// set a variable
$temp = 101.6;
// test it and log an error
if ($temp > 98.6)
{
error_log("Body temperature above normal.", 3, "a.out");
}
?>
or send it out as email.
<?php
// set a variable
$temp = 101.6;
// test it and log an error
if ($temp > 98.6)
{
error_log("Body temperature above normal.", 1,
"administrator@this.body.com"); }
?>
It's possible to combine this error logging facility with a
custom error handler to ensure that all script errors get logged to a file. Here's an example which demonstrates this:
<?php
// custom handler
function eh($type, $msg, $file, $line)
{
// log all errors
error_log("$msg (error type $type)", 0);
// if fatal error, die()
if ($type == E_USER_ERROR)
{
die($msg);
}
}
// report all errors
error_reporting(E_ALL);
// define custom handler
set_error_handler("eh");
// let's go through the rogues gallery
// this will trigger E_NOTICE (undefined variable)
echo $someVar;
// this will trigger E_WARNING (missing file) include("common.php");
// this will trigger E_USER_NOTICE
trigger_error("Time for lunch");
// this will trigger E_USER_WARNING
trigger_error("Body temperature above normal", E_USER_WARNING);
// this will trigger E_USER_ERROR
trigger_error("No brain activity", E_USER_ERROR);
?>
And here's the output that gets logged to the system log
file:
[28-Feb-2002 16:15:06] Undefined variable: someVar (error type 8)
[28-Feb-2002 16:15:06] Failed opening 'common.php' for inclusion
(include_path='.;') (error type 2)
[28-Feb-2002 16:15:06] Time for lunch (error type 1024) [28-Feb-2002
16:15:06] Body temperature above normal (error type 512) [28-Feb-2002
16:15:06] No brain activity (error type 256)