在PHP默认的错误处理很简单。 用文件名,行号和描述错误的消息的错误消息被发送到浏览器。
PHP错误处理
在创建脚本和web应用程序,错误处理是一个重要的组成部分。 如果您的代码缺少错误检测编码,那么程序看上去很不专业,可能是开放的安全隐患。
本教程包含了一些最常见的错误检查PHP方法。
我们会表现出不同的错误处理方法:
- 简单的" die() "语句
- 自定义错误和错误触发器
- 错误报告
基本的错误处理:使用die()函数
第一个例子表明,打开一个文本文件的简单脚本:
<?php
$file=fopen("welcome.txt","r");
?>
如果该文件不存在,你可能会得到这样的错误:
Warning : fopen(welcome.txt) [function.fopen]: failed to open stream:
No such file or directory in C:\webfolder\test.php on line 2
为了防止用户收到错误消息像上面的,我们测试文件是否存在之前,我们尝试访问它:
<?php
if(!file_exists("welcome.txt")) {
die("File not found");
}
else {
$file=fopen("welcome.txt","r");
}
?>
现在,如果文件不存在,你会得到这样的错误:
File not found
上面的代码比前面的代码更有效,因为它使用了一个简单的错误处理机制在错误发生后停止脚本。
然而,简单地停止脚本并不总是正确的道路要走。 让我们来看看用于处理错误的替代PHP函数。
创建自定义错误处理程序
创建自定义错误处理程序非常简单。 我们简单地创建一个特殊的函数在PHP中发生错误,可以调用。
该函数必须能够处理至少两个参数(错误级别和错误消息),但是可以接受最多五个参数(optionally: file, line-number, and the error context) :
句法
error_function(error_level,error_message,
error_file,error_line,error_context)
参数 | 描述 |
---|---|
error_level | 需要。 指定用户定义的错误错误报告水平。 必须是一个值数。 请参阅下面的错误报告级别表 |
error_message | 需要。 指定用户定义的错误的错误消息 |
error_file | 可选的。 指定发生错误的文件名 |
error_line | 可选的。 指定发生错误的行号 |
error_context | 可选的。 指定包含各变量的阵列,和它们的值,在使用中发生错误时 |
错误报告级别
这些错误报告级别是不同类型的错误的用户定义的错误处理程序,可用于:
值 | 不变 | 描述 |
---|---|---|
2 | E_WARNING | 非致命的运行时错误。 脚本执行不被中断。 |
8 | E_NOTICE | 运行时通知。 脚本发现这可能是一个错误,但通常运行一个脚本时,也可能发生 |
256 | E_USER_ERROR | 致命的用户生成错误。 这就像使用PHP函数由程序员设置E_ERROR trigger_error() |
512 | E_USER_WARNING | 非致命的用户生成的警告。 这就像使用PHP函数由程序员设置E_WARNING trigger_error() |
1024 | E_USER_NOTICE | 用户生成通知。 这就像使用PHP函数由程序员设置E_NOTICE trigger_error() |
4096 | E_RECOVERABLE_ERROR | 捕获的致命错误。 这是类似E_ERROR,但可以由用户定义的处理程序捕获(see also set_error_handler() |
8191 | E_ALL | 所有的错误和警告(E_STRICT became a part of E_ALL in PHP 5.4) |
现在,让我们创建一个函数来处理错误:
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "Ending Script";
die();
}
上面的代码是一个简单的错误处理功能。 当它被触发时,它会错误级别和错误消息。 它随后输出该错误水平和消息,并且终止该脚本。
现在,我们已经创建了一个错误处理函数,我们需要确定在何时被触发。
设置错误处理程序
PHP的默认错误处理程序是内置的错误处理程序。 我们要作的脚本运行期间的默认错误处理程序上面的功能。
它有可能改变错误处理程序申请只有一些错误,这样脚本可以以不同方式处理不同的错误。 然而,在这个例子中,我们将使用我们的自定义错误处理程序对所有错误:
set_error_handler("customError");
因为我们希望我们的自定义函数来处理所有错误, set_error_handler()只需要一个参数,第二个参数可以被添加到指定的错误级别。
例
试图通过不存在的输出变量测试错误处理程序:
<?php
//error handler function
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr";
}
//set error handler
set_error_handler("customError");
//trigger error
echo($test);
?>
以上代码的输出应该是这样的:
Error: [8] Undefined variable: test
引发错误
在脚本中,用户可以输入数据,它是有用的,当非法输入时触发的错误。 在PHP中,这是由做trigger_error()函数。
例
在这个例子中,如果发生错误, "test"变量大于大"1" :
<?php
$test=2;
if ($test>=1)
{
trigger_error("Value must be 1 or below");
}
?>
以上代码的输出应该是这样的:
Notice : Value must be 1 or below
in C:\webfolder\test.php on line 6
任何地方都可以触发一个错误,你希望在一个脚本,并通过添加第二个参数,你可以指定哪些错误级别被触发。
可能的错误类型:
- E_USER_ERROR - 致命的用户生成运行时错误。 无法从恢复的错误。 脚本执行停止
- E_USER_WARNING - 非致命的用户生成运行时警告。 脚本执行不被中断。
- E_USER_NOTICE - 默认。 用户生成的运行时间另行通知。 脚本发现这可能是一个错误,但通常运行一个脚本时,也可能发生
例
在这个例子中,如果一个发生E_USER_WARNING "test"变量大于大"1" 。 如果发生了E_USER_WARNING,我们将使用我们的自定义错误处理程序并结束脚本:
<?php
//error handler function
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "Ending Script";
die();
}
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>=1) {
trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>
以上代码的输出应该是这样的:
Error: [512] Value must be 1 or below
Ending Script
现在,我们已经学会了创造我们自己的错误,以及如何触发它们,让我们来看看在错误日志记录。
错误记录
默认情况下,PHP发送一个错误日志服务器的日志系统或文件,这取决于error_log配置如何在php.ini文件中设定。 通过使用error_log()函数,你可以发送错误日志到指定的文件或远程目标。
通过e-mail发送错误信息到自己可以的得到通知的具体错误的一个好方法。
通过电子邮件发送错误信息
在下面的例子中,我们将发送一封电子邮件,并显示错误消息并结束脚本,如果发生特定的错误:
<?php
//error handler function
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "Webmaster has been notified";
error_log("Error: [$errno] $errstr",1,
"[email protected]","From: [email protected]");
}
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>=1) {
trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>
以上代码的输出应该是这样的:
Error: [512] Value must be 1 or below
Webmaster has been notified
而从上面的代码中收到的邮件是这样的:
Error: [512] Value must be 1 or below
这不应该与所有的错误使用。 常规错误应该使用默认的PHP记录系统在服务器上登录。