标签分类 技术文章:
当前位置:首页 > PHP编程文章 > PHP中错误与异常的日志记录用法分析

PHP异常和错误的日志记录用法

  • 发布时间:
  • 作者:码农之家原创
  • 点击:114

这篇文章主要知识点是关于PHP、错误、异常、日志记录、浅谈PHP中的错误处理和异常处理 的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

PHP 7 编程实战
PHP 7 编程实战超清完整版
  • 类型:PHP7大小:11.2 MB格式:PDF出版:电子工业出版社作者:道格·比尔
立即下载

更多PHP相关的学习资源可以参阅 PHP电子书程序设计电子书 等栏目。

PHP中错误与异常的日志记录用法分析

本文分析了PHP中错误与异常的日志记录用法。分享给大家供大家参考,具体如下:

提到 Nginx + PHP 服务的错误日志,我们通常能想到的有 Nginx 的 access 日志、error 日志以及 PHP 的 error 日志。虽然看起来是个很简单的问题,但里面其实又牵扯到应用配置以及日志记录位置的问题,如果是在 ubuntu 等系统下使用 apt-get 的方式来安装,其自有一套较为合理的的配置文件可用。再者运行的应用程序中的配置也会影响到日志记录的方式及内容。

错误与异常的区别

关于错误与异常,我们可以用一个简单的例子来理解:

<?php
try {
 1 / 0;
} catch (Exception $e) {
 echo "catched", PHP_EOL;
}

执行这个小示例会直接得到一个『PHP Warning: Division by zero …』错误。原因很简单:这是逻辑错误,并不是异常,所以不能被 try 捕获。同样,对于变量使用前未定义这种问题,也是同样的会产生 warning 而不是被捕获。

但是这个问题在 PHP7 中却有了一些改动,比如上面的例子中我把 / 改成 %,在 PHP7 的环境中执行会得到一个不一样的提示:

PHP Fatal error: Uncaught DivisionByZeroError ...

根据这个提示,如果我把 catch 中的条件修改一下:

<?php
try {
 1 / 0;
} catch (DivisionByZeroError $e) {
 echo "catched", PHP_EOL;
}

这样就可以正常捕获到错误并输出 catched 了。

对于第一个示例,同样如果把 Excepiton 修改为 ErrorException 也可以正常捕获。

至于为什么求余和除法,在 PHP5 中提示一致而在 PHP7(我的测试环境是 7.0.4) 中除法不属于 DivisionByZeroError 的问题,这应该是个 BUG。

日志的记录

PHP 本身可配置的 log 大概有以下几个:

① php-fpm error log(php-fpm.conf 中配置,记录 php-fpm 进程的启动和终止等信息)
② php-fpm slow log(也是在 php-fpm.conf 中配置,记录慢执行)
③ php error log(php.ini 中配置,记录应用程序的错误日志)

此外 Nginx 还有两个可配置的log:access 和 error log。这几个日志文件的功能不同,记录的内容也不同。但其中有一个点需要注意:如果配置了 php-fpm 中的 error log 位置,但日志位置不可写(配置时位置得是对的,因为 php-fpm 启动时会做检查),在适当的配置条件下错误日志会被返回到 cgi 中从而写入 nginx 的 error log 中。

所以遇到问题是我们一般的查找思路都是:

1. 到 Nginx access log 中查看请求的状态码
2. 查看 php error log 中的错误记录以及 stack 信息
3. 查看 php-fpm log 中有无异常重启记录(如果核心或者扩展问题,会出现此情况)

但是在以上几种情况下你也会发现,这里面并没有上文提到的程序抛出异常的日志记录。

异常记录

异常不同于错误,严格上说它是应用程序逻辑的异常而不是错误,是可以通过合理的程序逻辑来手动触发的。但大多情况下异常也是要进行记录的,比如数据库无法连接或者框架的不当使用触发的异常,我们需要通过日志来定位问题并及时处理。

PHP 提供了两个函数用于自定义处理错误和异常的方法:

① set_error_handler

② set_exception_handler

所以可以通过 set_exception_handler 函数注入方法捕获所有的异常并记录 。

monolog 是一个优秀的异常记录的库,也是基于 PSR-3 标准的实现。Laravel、Symfony 中默认也是使用它来记录异常。如有需要,也可以考虑在自己的项目中引入。

希望本文所述对大家PHP程序设计有所帮助。

浅谈PHP中的错误处理和异常处理

错误处理:
    
    1. 语法错误
    2. 运行时的错误
    3. 逻辑错误

 

错误报告:
        
        错误E_ERROR
        警告E_WARNING
        注意E_NOTICE


开发阶段:开发时输出所有的错误报告,有利于我们进行调试

运行阶段:不要让程序输出任何一种错误报告

将错误报告写入日志中

一.   指定错误报告error_reporting=E_ALL(在php.inn)

二.   关闭错误输出display_errors=off(在php.ini中)

三.   开启错误日志的功能log_errors=on(在php.ini中)

1. 默认如果不指定错误日志位置,则默认写入web服务器的日志中

2. 为error_log选项指定一个文件名,这个文件名就是错误日志

3. 写入到操作系统日志中error_log=syslog

<?php
//注意和警告都不会终止程序的运行,但是错误会终止程序的运行

/*
错误E_ERROR
警告E_WARNING
注意E_NOTICE
*/
//所有的错误都输出除了注意
error_reporting(E_ALL & ~E_NOTICE);

//设置配置文件的值(临时)
//ini_set("upload_max_filesize", 2000000000);

//得到配置文件的值
//ini_get("upload_max_filesize");

//关闭错误报告的显示,一般在运行阶段使用
ini_set("display_errors", "off");
//将错误报告写入日志中
ini_set("log_errors", "on");
//日志的目录
ini_set("error_log", "D:/error.log");
gettype($var);  //注意

gettype();    //警告

//getype();    //错误,程序终止

echo "############<br>";
?>

异常处理:意外,是在程序运行过程中发生的意料之外的事,使用异常改变脚本正常流程

 PHP5中的一个新的重要特性


    try{

    }catch(异常对象){

    }

1.  如果try中代码没有问题,则将try中代码执行完成后就到catch后执行

2.  如果try中代码有异常发生,则抛出一个异常对象(使用throw),抛出给了catch中的参数,则在try中出现异常代码后的内容就不会执行,直接跳转到catch中去执行,catch中执行完成,再继续向下执行

<?php
try{
  echo "11111111<br>";
  $file=@fopen("./hello.txt","r");
  if(!$file){
    throw new Exception("文件打开失败");
    
  }
  echo "2222222222<br>";
}catch(Exception $e){
  echo "3333333<br>";
  echo $e->getMessage()."<br>";
  touch("hello.txt");
  $file=@fopen("./hello.txt","r");
}
echo "4444444<br>";
?>

以上这篇浅谈PHP中的错误处理和异常处理就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持码农之家。

以上就是本次给大家分享的关于PHP的全部知识点内容总结,大家还可以在下方相关文章里找到PHP用户验证和标签推荐的、 PHP中的日期时间处理利器、 ThinkPHP的模板引擎如何达到、 等php文章进一步学习,感谢大家的阅读和支持。

上一篇:php给图片添加水印实例代码

下一篇:php获取客户端IP及URL的实例方法

展开 +

收起 -

学习笔记
网友NO.310855

实例分析PHP7的异常

PHP 7 异常 用于向下兼容及增强旧的assert()函数。它能在生产环境中实现零成本的断言,并且提供抛出自定义异常及错误的能力。 老版本的API出于兼容目的将继续被维护,assert()现在是一个语言结构,它允许第一个参数是一个表达式,而不仅仅是一个待计算的 string或一个待测试的boolean。 assert() 配置 配置项 默认值 可选值 zend.assertions 1 1 - 生成和执行代码 (开发模式) 0 - 生成代码,但在执行时跳过它 -1 - 不生成代码 (生产环境) assert.exception 0 1 - 断言失败时抛出,可以抛出异常对象,如果没有提供异常,则抛出 AssertionError 对象实例。 0 - 使用或生成 Throwable, 仅仅是基于对象生成的警告而不是抛出对象(与 PHP 5 兼容) 参数 assertion 断言。在 PHP 5 中,是一个用于执行的字符串或者用于测试的布尔值。在 PHP 7 中,可以是一个返回任何值的表达式, 它将被执行结果用于指明断言是否成功。 description 如果 assertion 失败了,选项 description 将会包括在失败信息里。 exception 在 PHP 7 中,第二个参数可以是一个 Throwable 对象,而不是一个字符串,如果断言失败且启用了 assert.exception 该对象将被抛出。 实例 将 zend.assertions 设置为 0: ?php ini_set(zend.assertions, 0); assert(true == false); echo Hi!; ? 以上程序执行输出结果为: Hi! 将 zend.assertions 设置为 1,assert.……

网友NO.773983

PHP制作登录异常ip检测功能的实例代码

使用函数查询数据库遍历实现 /** * 不在常用ip地址登录返回描红信息 * @param string $ip ip地址 * @param string $name 用户名 * @return string */function errorIp($ip,$name){ $nowip = get_client_ip(); //判断ip和当前ip是否相同,不同则查询数据库对比 if($ip == $nowip ){ //相同直接返回字符串 $str = 'font color="blue"'."登录IP:".$ip."/font"; }else{ //不同则记数这个ip地址数量 $count = M('log')-where("name='{$name}' AND ip='{$ip}'")-count(); //如果超过一定数量则是正常ip否则为异常返回字符串 if($count 10){ $str = 'font color="blue"'."登录IP:".$ip."/font"; }else{ $str = 'font color="red"'."异常IP:".$ip."/font"; } } return $str;} 注释:适合所有框架使用,get_client_ip()是ip获取函数。 get_client_ip函数片段: function get_client_ip() { if(getenv('HTTP_CLIENT_IP') strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) { $ip = getenv('HTTP_CLIENT_IP'); } elseif(getenv('HTTP_X_FORWARDED_FOR') strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) { $ip = getenv('HTTP_X_FORWARDED_FOR'); } elseif(getenv('REMOTE_ADDR') strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) { $ip = getenv('REMOTE_ADDR'); } else{ $ip = $_SERVER['REMOTE_ADDR']; } return $ip;} 以上这篇PHP制作登录异常ip检测功能的实例代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持码农之家。 ……

网友NO.163171

PHP错误和异常处理功能模块示例

本文实例讲述了PHP错误和异常处理功能模块。分享给大家供大家参考,具体如下: 一、错误类型和基本的调试方法 PHP程序的错误发生一般归属于下列三个领域: 语法错误: 语法错误最常见,并且也容易修复。如:代码中遗漏一个分号。这类错误会阻止脚本的执行。 运行时错误: 这种错误一般不会阻止PHP脚本的执行,但会阻止当前要做的事情。输出一条错误,但php脚本继续执行 逻辑错误: 这种错误最麻烦,既不阻止脚本执行,也不输出错误消息。 一个异常则是在一个程序执行过程中出现的一个例外,或是一个事件,它中断了正常指令的运行,跳转到其他程序模块继续执行。 PHP的错误报告级别 E_ALL //所有信息值:6143 E_ERROR//致命的运行时错误值:1 E_RECOVERABLE_ERROR //接近致命的运行时错误,若未被捕获则视同E_ERROR 值:4096 E_WARNING //运行时警告(非致命性错误) 值:2 E_PARSE//编译时解析错误值:4 E_NOTICE //运行时提醒(经常是bug,也可能是有意的) 值:8 E_STRICT//编码标准化警告(建议如何修改以向前兼容) 值:2048 E_CORE_ERROR //PHP启动时初始化过程中的致命错误值:16 E_CORE_WARNING //PHP启动时初始化过程中的警告(非致命性错)值:32 E_COMPILE_ERROR //编译时致命性错值:64 E_COMPILE_WARNING //编译时警告(非致命性错) 值:128 E_USER_ERROR //用户自定义……

网友NO.123648

php封装一个异常的处理类

本文实例为大家分享了php自定义异常处理类,供大家参考,具体内容如下 一、代码 !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" html xmlns="http://www.w3.org/1999/xhtml" head meta http-equiv="Content-Type" content="text/html; charset=utf-8" / title自定义异常处理类/title /head body ?php class TelException extends Exception{ //定义TelException类,继承Exception类 public function errorTel(){ //定义方法返回错误信息 $errorMsg = "出错原因:".$this-getMessage()."不是一个合法的电话号码"; $errorMsg .="br"; $errorMsg .="错误文件路径:".$this-getFile(); $errorMsg .="br"; $errorMsg .="错误代码行号:".$this- getLine(); return $errorMsg; } } function check_tel($tel){ //自定义函数验证电话号码格式是否正确 $checkphone="/^13(\\d{9})$/"; //定义验证手机号码的正则表达式 $counts=preg_match($checkphone,$tel); //执行验证操作 return $counts; //返回验证结果 } $tel = "133891gfj"; //定义被验证的电话号码 /* 通过自定义异常处理类返回错误提示 */ try { if(check_tel($tel) !=1){ throw new TelException($tel); } }catch (TelException $e){ include_once("error.php"); } ? /body /html /body /html 二、运行结果 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。 ……

<
1
>

Copyright 2018-2019 xz577.com 码农之家

版权责任说明