The error mechanism of PHP is also very complicated. I have been working in PHP for several years and have not summarized it carefully. I will make up for this lesson now.
Special note: The PHP version of the article uses 5.5.32
Error level of PHP
First of all, you need to understand what errors there are in PHP. As of php5.5, there are a total of 16 error levels
Note: Please make sure to open error_log when trying the following code:
error_reporting(E_ALL); ini_set('display_errors', 'On');
E_ERROR
This error is a fatal error and will display Fatal Error on the page. When this error occurs, the program cannot continue to execute
Error example:
// Fatal error: Call to undefined function hpinfo() in /tmp/php/index.php on line 5 hpinfo(); //E_ERROR
Note that if there is an uncaught exception, this level will also be triggered.
// Fatal error: Uncaught exception 'Exception' with message 'test exception' in /tmp/php/index.php:5 Stack trace: #0 {main} thrown in /tmp/php/index.php on line 5 throw new Exception("test exception");
E_WARNING
This error is just a warning and will not terminate the script. The program will continue, display The error message is Warning. For example, include a file that does not exist.
//Warning: include(a.php): failed to open stream: No such file or directory in /tmp/php/index.php on line 7 //Warning: include(): Failed opening 'a.php' for inclusion (include_path='.:/usr/share/pear:/usr/share/php') in /tmp/php/index.php on line 7 include("a.php"); //E_WARNING
E_NOTICE
This error is more minor and reminds you that this place should not be written like this. This is also a runtime error. The wrong code may not have problems elsewhere, but only in the current context.
For example, the $b variable does not exist, we assign it to another variable
//Notice: Undefined variable: b in /tmp/php/index.php on line 9 $a = $b; //E_NOTICE
E_PARSE
This error is Occurs during compilation. Syntax errors are found during compilation and syntax analysis cannot be performed.
For example, z below is not set as a variable.
// Parse error: syntax error, unexpected '=' in /tmp/php/index.php on line 20 z=1; // E_PARSE
E_STRICT
This error was introduced after PHP5. Your code can run, but it is not written in the way recommended by PHP.
For example, passing the ++ symbol in the function parameter
// Strict Standards: Only variables should be passed by reference in /tmp/php/index.php on line 17 function change (&$var) { $var += 10; } $var = 1; change(++$var); // E_STRICT##E_RECOVERABLE_ERRORThis level is actually It is ERROR level, but it is expected to be caught. If it is not caught by error processing, the performance is the same as E_ERROR. often occurs when the formal parameter defines a type, but the wrong type is passed in when calling. Its error reminder also has the word Catachable in front of E_ERROR's fatal error.
//Catchable fatal error: Argument 1 passed to testCall() must be an instance of A, instance of B given, called in /tmp/php/index.php on line 37 and defined in /tmp/php/index.php on line 33 class A { } class B { } function testCall(A $a) { } $b = new B(); testCall($b);E_DEPRECATEDThis error means that you used an old version of the function, and later versions of this function may Disabled or not maintained. For example, curl's CURLOPT_POSTFIELDS uses @FILENAME to upload files
// Deprecated: curl_setopt(): The usage of the @filename API for file uploading is deprecated. Please use the CURLFile class instead in /tmp/php/index.php on line 42 $ch = curl_init("http://www.remotesite.com/upload.php"); curl_setopt($ch, CURLOPT_POSTFIELDS, array('fileupload' => '@'. "test"));
These two errors are generated by the PHP engine and occur during the PHP initialization process.
E_COMPILE_ERROR, E_COMPILE_WARNING
These two errors are generated by the PHP engine and occur during the compilation process.
E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE, E_USER_DEPRECATED,
These errors are all caused by users. Using trigger_error is equivalent to a hole for users to trigger various error types. This is a good way to escape try catch exceptions.
trigger_error("Cannot pide by zero", E_USER_ERROR); // E_USER_ERROR // E_USER_WARING // E_USER_NOTICE // E_USER_DEPRECATED
E_STRICT All error and warning messages out.
Error control
There are many configurations and parameters in php that can control errors and error log display. The first step, what we need to know is what are the incorrect configurations in PHP?
We follow the php+php-fpm model. There are actually two configuration files that will affect the display of php errors. One is the configuration file php.ini of php itself, and the other is php-fpm. Configuration file, php-fpm.conf.
Configuration in php.ini
error_reporting = E_ALL // 报告错误级别,什么级别的 error_log = /tmp/php_errors.log // php中的错误显示的日志位置 display_errors = On // 是否把错误展示在输出上,这个输出可能是页面,也可能是stdout display_startup_errors = On // 是否把启动过程的错误信息显示在页面上,记得上面说的有几个Core类型的错误是启动时候发生的,这个就是控制这些错误是否显示页面的。 log_errors = On // 是否要记录错误日志 log_errors_max_len = 1024 // 错误日志的最大长度 ignore_repeated_errors = Off // 是否忽略重复的错误 track_errors = Off // 是否使用全局变量$php_errormsg来记录最后一个错误 xmlrpc_errors = 0 //是否使用XML-RPC的错误信息格式记录错误 xmlrpc_error_number = 0 // 用作 XML-RPC faultCode 元素的值。 html_errors = On // 是否把输出中的函数等信息变为HTML链接 docref_root = http://manual/en/ // 如果html_errors开启了,这个链接的根路径是什么 fastcgi.logging = 0 // 是否把php错误抛出到fastcgi中
PHP默认是会在日志和标准输出(如果是fpm模式标准输出就是页面)
error_reporting的参数是错误级别。表示什么样子的级别才应该触发错误。如果我们告诉PHP,所有错误级别都不需要触发错误,那么,不管是日志,还是页面,都不会显示这个错误,就相当于什么都没有发生。
display_errors是控制是否要在标准输出展示错误信息
log_errors则是控制是否要在日志中记录错误信息。
error_log是显示错误日志的位置,这个在php-fpm中往往会被重写,于是往往会发现的是cli和fpm的错误日志竟然不是在同一个文件中。
ignore_repeated_errors这个标记控制的是如果有重复的日志,那么就只会记录一条,比如下面的程序:
error_reporting(E_ALL); ini_set('ignore_repeated_errors', 1); ini_set('ignore_repeated_source', 1); $a = $c; $a = $c; //E_NOTICE //Notice: Undefined variable: c in /tmp/php/index.php on line 20
本来会出现两次NOTICE的,但是现在,只会出现一次了…
track_errors开启会把最后一个错误信息存储到变量里面去,这个可能在对记日志的时候会有一些用处吧。不过我觉得真是没啥用…
html_errors 和 docref_root 两个是个挺有人性化的配置,配置了这两个参数以后,我们返回的错误信息中如果有一些在文档中有的信息,就会变成链接形式。
error_reporting(E_ALL); ini_set('html_errors', 1); ini_set('docref_root', "https://secure.php.net/manual/zh/"); include("a2.php"); //E_WARNING
能让你快速定位到我们出现错误的地方。是不是很人性~
php-fpm中的配置
error_log = /var/log/php-fpm/error.log // php-fpm自身的日志 log_level = notice // php-fpm自身的日志记录级别 php_flag[display_errors] = off // 覆盖php.ini中的某个配置变量,可被程序中的ini_set覆盖 php_value[display_errors] = off // 同php_flag php_admin_value[error_log] = /tmp/www-error.log // 覆盖php.ini中的某个配置变量,不可被程序中的ini_set覆盖 php_admin_flag[log_errors] = on // 同php_admin_value catch_workers_output = yes // 是否抓取fpmworker的输出 request_slowlog_timeout = 0 // 慢日志时长 slowlog = /var/log/php-fpm/www-slow.log // 慢日志记录
而php.ini中的error_log是记录php程序本身的错误日志。
那么在php-fpm中要覆盖php.ini中的error_log配置,就需要使用到下面几个函数:
php_flag
php_value
php_admin_flag
php_admin_value
这四个函数admin的两个函数说明这个变量设置完之后,不能在代码中使用ini_set把这个变量重新赋值了。而php_flag/value就仍然以php代码中的ini_set为准。
slowlog是fpm记录的,可以使用request_slowlog_timeout设置判断慢日志的时长。
总结
我们经常弄混的就是日志问题,以及某些级别的日志为何没有记录到日志中。最主要的是要看error_log,display_errors, log_errors这三个配置,只是在看配置的时候,我们还要注意区分php.ini里面的配置是什么,php-fpm.ini里面的配置是什么。
好吧,我觉得弄懂这些配置,基本就没有php日志记录不了的WTF的问题了。
The above is the detailed content of PHP error mechanism. For more information, please follow other related articles on the PHP Chinese website!

Load balancing affects session management, but can be resolved with session replication, session stickiness, and centralized session storage. 1. Session Replication Copy session data between servers. 2. Session stickiness directs user requests to the same server. 3. Centralized session storage uses independent servers such as Redis to store session data to ensure data sharing.

Sessionlockingisatechniqueusedtoensureauser'ssessionremainsexclusivetooneuseratatime.Itiscrucialforpreventingdatacorruptionandsecuritybreachesinmulti-userapplications.Sessionlockingisimplementedusingserver-sidelockingmechanisms,suchasReentrantLockinJ

Alternatives to PHP sessions include Cookies, Token-based Authentication, Database-based Sessions, and Redis/Memcached. 1.Cookies manage sessions by storing data on the client, which is simple but low in security. 2.Token-based Authentication uses tokens to verify users, which is highly secure but requires additional logic. 3.Database-basedSessions stores data in the database, which has good scalability but may affect performance. 4. Redis/Memcached uses distributed cache to improve performance and scalability, but requires additional matching

Sessionhijacking refers to an attacker impersonating a user by obtaining the user's sessionID. Prevention methods include: 1) encrypting communication using HTTPS; 2) verifying the source of the sessionID; 3) using a secure sessionID generation algorithm; 4) regularly updating the sessionID.

The article discusses PHP, detailing its full form, main uses in web development, comparison with Python and Java, and its ease of learning for beginners.

PHP handles form data using $\_POST and $\_GET superglobals, with security ensured through validation, sanitization, and secure database interactions.

The article compares PHP and ASP.NET, focusing on their suitability for large-scale web applications, performance differences, and security features. Both are viable for large projects, but PHP is open-source and platform-independent, while ASP.NET,

PHP's case sensitivity varies: functions are insensitive, while variables and classes are sensitive. Best practices include consistent naming and using case-insensitive functions for comparisons.


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Atom editor mac version download
The most popular open source editor

DVWA
Damn Vulnerable Web App (DVWA) is a PHP/MySQL web application that is very vulnerable. Its main goals are to be an aid for security professionals to test their skills and tools in a legal environment, to help web developers better understand the process of securing web applications, and to help teachers/students teach/learn in a classroom environment Web application security. The goal of DVWA is to practice some of the most common web vulnerabilities through a simple and straightforward interface, with varying degrees of difficulty. Please note that this software

VSCode Windows 64-bit Download
A free and powerful IDE editor launched by Microsoft

MantisBT
Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

Zend Studio 13.0.1
Powerful PHP integrated development environment
