我们已经准备好了,你呢?

2024我们与您携手共赢,为您的企业形象保驾护航!

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问题了。

关闭导航_php 关闭 notice_关闭所有车窗

二维码
扫一扫在手机端查看

本文链接:https://by928.com/4654.html     转载请注明出处和本文链接!请遵守 《网站协议》
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。

项目经理在线

我们已经准备好了,你呢?

2020我们与您携手共赢,为您的企业形象保驾护航!

在线客服
联系方式

热线电话

13761152229

上班时间

周一到周五

公司电话

二维码
微信
线