编写的程序在运行中都可能会出现一些错误或者警告等,当php解释器解释执行php文件时,如果遇到php错误,就会向外抛出问题
,具体我们可以在php.ini配置文件中进行配置。php错误分很多级别,详细如下:
-
E_ERROR : 致命运行错误,会停止脚本运行
-
E_WARNING : 运行时的警告信息,不会停止脚本运行
-
E_PARSE : 语法解析错误
-
E_NOTICE : 运行是的消息信息
-
E_CORE_ERROR : 类似E_ERROR,但是不包括php核心错误
-
E_CORE_WARNING : 类似E_WARNING,但是不包括php核心警告
-
E_COMPILE_ERROR : 致命编译错误
-
E_COMPILE_WARNING : 致命编译警告
-
E_USER_ERROR : 用户导致的错误
-
E_USER_WARNING : 用户导致的警告
-
E_USER_NOTICE : 用户导致的消息
-
E_ALL : 所有的错误、消息和消息。
-
E_SCRIPT : 关于php版本移植的兼容性和操作性建议
如果程序在开发过程中想看到php错误消息,要在php.ini文件中将display_errors配置项设置成on(注意在程序上线运行时,一定要将display_errors关掉,否则容易泄漏有关服务器的信息,为进一步攻击造成铺垫)。我们还可以定义php报告错误的级别,具体在error_reporting配置项。
<html>
<head>
<title>php错误和异常</title>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
</head>
<body>
<?php
echo ini_get("log_errors") . "<br />";
echo ini_get("display_errors") . "<br />";
ini_set("display_errors", 1); //打开php的错误输出(正式环境要关闭)
error_reporting(E_ALL&~(E_WARNING | E_NOTICE));//设置php输出错误的级别,输入非E_WARNING和E_NOTICE级别的错误
gettype($name);//调用没有定义的变量
gettype();//调用函数时,没有指定必须的参数
getName();//调用没有定义的函数
?>
</body>
</html>
如上面代码就会输入getName()这一行代码抛出的错误信息:
1
1
( ! ) Fatal error: Call to undefined function getName() in /home/youthflies/work/workspace/php/test/test3.php on line 15Call Stack#TimeMemoryFunctionLocation10.0268126916{main}( )../test3.php:0
我们还可以自定义错误处理函数,这样我们就可以随时记录错误信息、屏蔽错误输出(防止黑客攻击)、指定友好的错误页面。一般使用set_error_handler()函数来手工指定错误处理函数。
<?php
//为了网站安全,一定要屏蔽掉一切的错误输出
error_reporting(0);
/**
* 自定义Error_Handler函数,作为set_error_handler()函数的回调函数,该函数必须有四个参数
* @param int $error_level 错误级别
* @param string $error_message 错误消息
* @param string $file 发生错误的文件
* @param int $line 发生错误的行数
*/
function error_handler($error_level, $error_message, $file, $line)
{
$EXIT = FALSE;
switch ($error_level)
{
//错误级别
case E_ERROR:
case E_USER_ERROR:
$error_type = "Fatal Error";
$EXIT = true;
break;
//提醒级别
case E_NOTICE:
case E_USER_NOTICE:
$error_type = "Notice";
break;
//警告级别
case E_WARNING:
case E_USER_WARNING:
$error_type = " Warning";
break;
//其他未知错误
default:
$error_type = "Unknown";
$EXIT = true;
break;
}
//直接打印输出错误信息,但是为了安全,一般是写入文件,或者数据库
printf("<font clolr='#FF0000'><b>%s</b></font>:%s in <b>%s</b> on line <b> %d </b><br>n", $error_type, $error_message, $file, $line);
if($EXIT == true)
echo '<script>location="error.html"</script>';
}
//设置错误处理函数
set_error_handler('error_handler');
//报未定义的变量notice
echo $name;
//报除0警告
echo 10/0;
//手动抛出错误
trigger_error('致命错误', E_USER_ERROR);
?>
通过更改php.ini配置文件,我们可以将错误信息输出到指定文件中:
error_reporting = E_ALL ;抛出每一个错误、警告
display_errors = Off ; 关闭错误展示
log_errors = On ;决定日志语句记录的位置
log_errors_max_len = 1024 ;每个日志项的最大长度
error_log = /home/yourname/work/error.log ; 指定错误日志文件
修改完毕后,重启Web服务器,即可生效。然后再运行含有错误的php代码,错误信息就会被写入到error.log中。
我们还可以自定义错误信息,error_log()函数允许我们自定义错误。
error_log("This is an error", 3, "/home/yourname/work/error.log");
第一个参数是错误内容,第二个参数指定错误信息的输出位置,如果留空,就默认php.ini指定的位置,0表示操作系统日志,1表示使用php mail()函数发送出去,2表示将错误消息发送到tcp(此时第三个参数表示目标IP及端口),3表示存到本机文件中。
版权声明
本站文章、图片、视频等(除转载外),均采用知识共享署名 4.0 国际许可协议(CC BY-NC-SA 4.0),转载请注明出处、非商业性使用、并且以相同协议共享。
© 空空博客,本文链接:https://www.yeetrack.com/?p=78
近期评论