PHP的错误机制也很复杂,接触PHP好几年了,一直没详细总结过,现在把这个教训补上。
特别说明:本文使用的PHP版本为5.5.32
PHP 错误级别
首先,你需要了解 PHP 中有哪些错误。截至 PHP 5.5,共有 16 个错误级别。
注意:尝试以下代码时,请确保打开:
(E_全部);
('','在');
此错误为致命错误,在页面上会显示为 Fatal Error,当发生此错误时,程序无法继续执行。
错误示例:
// 致命错误:在 /tmp/php/index.php 第 5 行调用 ()
();//
请注意,如果有未捕获的异常,也会触发此级别。
// 致命错误:'' ,'test' 位于 /tmp/php/index.php:5 堆栈跟踪:#0 {main} 位于 /tmp/php/index.php 第 5 行
(“测试”);
此错误只是警告,不会终止脚本。程序将继续运行,并显示错误消息。例如,不存在的文件。
//: (a.php): 打开:没有这样的文件或位于 /tmp/php/index.php 第 7 行
//: (): 'a.php' for (='.:/usr/share/pear:/usr/share/php') in /tmp/php/index.php on line 7
(“a.php”);//
这个错误比较严重,告诉你这个地方不应该这么写,这也是一个运行时错误,出现这个错误的代码可能在其他地方没有问题,但是在当前上下文中就有问题了。
例如,如果 $b 变量不存在,我们将其分配给另一个变量。
//: :bin/tmp/php/index.php 在第 9 行
$a = $b; //
编译时发生此错误。编译时发现语法错误,无法进行语法分析。
例如下面的 z 没有被设置为变量。
// 解析错误:error, '=' 位于 /tmp/php/index.php 第 20 行
z=1;//
这个错误是在 PHP5 之后引入的。你的代码可以运行,但这不是用 PHP 编写的推荐方式。
例如,在函数参数中传递 ++ 符号时
// :只能在 /tmp/php/index.php 第 17 行
(&$var){
$var += 10;
$var = 1;
(++$变量);
//
这个级别其实就是ERROR级别,但是期望被捕获,如果没有被错误处理捕获,表现是一样的。
这经常发生在定义了参数类型,但是调用时传入了错误的类型,其错误信息也比致命错误前面多了一个字。
// 致命错误:1 到 () 必须是 A 中的一个,B 中的一个,位于 /tmp/php/index.php 第 37 行和 /tmp/php/index.php 第 33 行
{
{
(A$a){
$b = 新B();
($b);
这个错误意味着你正在使用某个功能的旧版本,而该功能的后续版本可能已被禁用或者不再维护。
例如curl使用@上传文件
// : (): 文件的 @ API 用法是。使用第 42 行 /tmp/php/index.php 中的类
$ch = (“”);
($ch,,array('' => '@'."test"));
,
这两个错误都是由PHP引擎产生的,发生在PHP初始化过程中。
,
这两个错误都是PHP引擎产生的,发生在编译过程中。
,,,,,
这些错误都是用户自己造成的,用在这里就相当于给用户提供了一个漏洞,可以触发各种错误类型,这是一个很好的逃避try catch异常的方法。
(" 除零",);
//
//
//
//
全部
输出所有错误和警告信息。
错误控制
PHP中有很多配置和参数可以控制错误以及错误日志,首先我们先来了解一下PHP中与错误相关的配置有哪些?
按照php+php-fpm模型,影响php错误显示的配置文件其实有两个,一个是php的配置文件php.ini,一个是php-fpm的配置文件php-fpm.conf。
php.ini 中的配置
= E_ALL // 报告错误级别,什么级别
= /tmp/.log// 显示 PHP 错误的日志位置
= On // 是否在输出中显示错误,可能是一页或
rs = On // 是否在页面上显示启动过程的错误信息,记得上面提到过启动过程中会出现几个Core错误,这个控制是否在页面上显示这些错误。
=On//是否记录错误日志
= 1024 // 错误日志的最大长度
rs = Off //是否忽略重复的错误
=Off //是否使用全局变量$记录最后一次错误
= 0 //是否使用XML-RPC错误信息格式记录错误
= 0 // 用作 XML-RPC 元素的值。
=On // 是否将输出中的函数和其他信息转换为 HTML 链接
= // 如果启用,此链接的根路径是什么
. = 0// 是否将 PHP 错误抛出到
我们经常被问到, 和 有什么区别?这两个函数完全不同。
默认情况下PHP会将内容输出在日志和标准输出中(如果是fpm模式,则标准输出为页面)。
参数是错误级别,表示什么级别的错误应该触发错误,如果我们告诉PHP,任何错误级别都不需要触发错误,那么日志和页面都不会显示错误,相当于什么都没有发生。
控制是否在标准输出上显示错误消息
控制是否在日志中记录错误信息。
就是错误日志显示的位置,这个在php-fpm中经常会被重写,所以经常会发现cli和fpm的错误日志不在同一个文件中。
rs标志控制如果有重复的日志,则只记录一个,例如下面的程序:
(E_全部);
('rs',1);
('ce',1);
$a = $c;$a = $c;//
//: : c 位于 /tmp/php/index.php 第 20 行
本来应该会出现两次,但现在,它只会出现一次……
如果启用此功能,最后一个错误消息将存储在变量中,这可能对日志记录有用。但我认为它没什么用……
这两个是非常人性化的配置,配置完这两个参数之后,如果我们返回的错误信息里面有文档中的一些信息的话,就会变成链接形式。
(E_全部);
('',1);
('',““);
(“a2.php”);//
可以让你快速的定位到我们错误的位置,是不是很人性化?
php-fpm 中的配置
= /var/log/php-fpm/error.log//php-fpm自己的日志
= // php-fpm 自己的日志记录级别
[] = off // 覆盖 php.ini 中的配置变量,该变量可以被程序覆盖
[] = off // 相同
[] = /tmp/www-error.log// 覆盖 php.ini 中的配置变量,并且无法被程序覆盖
[] = 开//相同
= yes//是否捕获输出
out = 0 // 慢日志持续时间
= /var/log/php-fpm/www-slow.log//慢日志记录
在php-fpm配置中还有一项配置,这个配置经常和php.ini中的配置混淆。但是他们记录的是不一样的东西。php-fpm只记录php-fpm自身的日志,比如fpm的启动、关闭等。
php.ini 文件包含 PHP 程序本身的错误日志。
在php-fpm中要覆盖php.ini中的配置,需要使用以下函数:
这四个函数中两个admin的作用表示设置变量之后,在代码中不能再对变量进行重新赋值,/value还是以PHP代码为准。
由 fpm 记录。可以使用 out 设置来确定慢日志的长度。
总结
我们经常会困惑的就是日志问题,为什么有些级别的日志没有记录在日志里,最主要的还是看这三个配置,但是在看配置的时候还要注意分清php.ini里的配置是什么,php-fpm.ini里的配置是什么。
好吧我想如果你理解了这些配置的话基本上就不会出现PHP日志不能记录的WTF问题了。
扫一扫在手机端查看
-
Tags : 关闭导航_PHP 的错误机制总结
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。