PHP의 오류 수준
먼저 PHP에 어떤 오류가 있는지 이해해야 합니다. php5.5에는 총 16개의 오류 수준이 있습니다.
참고: 다음 코드를 시도할 때 error_log를 켜십시오:
error_reporting(E_ALL); ini_set('display_errors', 'On');
E_ERROR
이 오류는 치명적인 오류이며 페이지에 Fatal Error가 표시됩니다. 이 오류가 발생하면 프로그램을 계속 실행할 수 없습니다.
오류 예:
// Fatal error: Call to undefined function hpinfo() in /tmp/php/index.php on line 5 hpinfo(); //E_ERROR
잡히지 않은 예외가 있으면 이 레벨도 트리거됩니다.
// 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");
이 오류는 단지 경고일 뿐이며 스크립트가 종료되지 않고 프로그램이 계속 진행되며 표시되는 오류 메시지는 경고입니다. 예를 들어 존재하지 않는 파일을 포함합니다.
//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
이 오류는 더 사소한 오류이므로 이 곳에 기록하면 안 된다는 점을 상기시켜 드립니다. 이는 런타임 오류이기도 합니다. 잘못된 코드는 다른 곳에서는 문제가 없을 수 있지만 현재 컨텍스트에서만 문제가 있을 수 있습니다.
예를 들어 $b 변수가 존재하지 않으면 이를 다른 변수에 할당합니다.
//Notice: Undefined variable: b in /tmp/php/index.php on line 9 $a = $b; //E_NOTICE
E_PARSE
이 오류는 컴파일 중에 발생합니다. , 컴파일 중에 구문 오류가 발견되어 구문 분석을 수행할 수 없습니다.
예를 들어 아래 z는 변수로 설정되지 않았습니다.
// Parse error: syntax error, unexpected '=' in /tmp/php/index.php on line 20 z=1; // E_PARSE
E_STRICT
이 오류는 PHP5 이후에 발생했지만, 이는 PHP에서 권장하는 방식이 아닙니다.
예를 들어 함수 매개변수에 ++ 기호를 전달하는 경우
// 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_ERROR
이 수준은 실제로는 ERROR 수준이지만 캡처될 것으로 예상되지만 오류 처리로 캡처되지 않은 경우 동작은 E_ERROR와 동일합니다.
은 형식 매개변수가 유형을 정의했지만 호출 시 잘못된 유형이 전달되는 경우가 자주 발생합니다. 오류 알림에는 E_ERROR의 치명적인 오류 앞에 Catachable이라는 단어도 있습니다.
//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_DEPRECATED
이 오류는 이전 버전의 함수를 사용하고 있으며 이 함수의 이후 버전이 비활성화되거나 비활성화될 수 있음을 의미합니다. 유지.
예를 들어, 컬의 CURLOPT_POSTFIELDS는 @FILENAME을 사용하여 파일을 업로드합니다.
// 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("//m.sbmmt.com/upload.php"); curl_setopt($ch, CURLOPT_POSTFIELDS, array('fileupload' => '@'. "test"));
E_CORE_ERROR, E_CORE_WARNING
이 두 오류는 다음에 의해 생성된 PHP로 인해 발생합니다. PHP 초기화 중에 발생합니다.
E_COMPILE_ERROR, E_COMPILE_WARNING
이 두 가지 오류는 PHP 엔진에 의해 생성되며 컴파일 프로세스 중에 발생합니다.
E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE, E_USER_DEPRECATED,
trigger_error를 사용하는 것은 사용자 유형에 따라 다양한 오류를 발생시키는 구멍과 같습니다. 이는 try catch 예외를 피하는 좋은 방법입니다.
trigger_error("Cannot divide by zero", E_USER_ERROR); // E_USER_ERROR // E_USER_WARING // E_USER_NOTICE // E_USER_DEPRECATED
E_ALL
E_STRICT 모든 오류 및 경고 메시지.
오류 제어
PHP에는 오류 및 오류 로그 표시를 제어할 수 있는 많은 구성과 매개변수가 있습니다. 첫 번째 단계에서 우리가 알아야 할 것은 PHP의 잘못된 구성이 무엇인지입니다.
php+php-fpm 모델에 따르면 실제로 php 오류 표시에 영향을 미치는 두 가지 구성 파일이 있습니다. 하나는 php 자체의 구성 파일 php.ini이고 다른 하나는 php-fpm입니다. . 구성 파일, php-fpm.conf.
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中
error_reporting과 display_errors의 차이점이 무엇인지 묻는 질문을 자주 받습니다. 이 두 기능은 완전히 다릅니다.
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-fpm 설정에도 error_log 설정이 있는데, 자주 발생하는 문제입니다. php와 관련되어 있습니다. ini의 error_log 구성이 혼란스럽습니다. 그러나 기록하는 내용은 다릅니다. php-fpm의 error_log는 fpm 시작 및 종료와 같은 php-fpm 자체의 로그만 기록합니다.
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을 기반으로 합니다.
느린 로그는 fpm에 의해 기록됩니다. request_slowlog_timeout 설정을 사용하여 느린 로그의 지속 시간을 결정할 수 있습니다.
요약
우리가 흔히 혼동하는 것은 로그 문제와 특정 수준의 로그가 로그에 기록되지 않는 이유입니다. 가장 중요한 것은 error_log, display_errors, log_errors의 세 가지 구성을 살펴보는 것입니다. 하지만 구성을 볼 때 php.ini의 구성이 무엇인지, php-errors의 구성이 무엇인지 구별하는 것도 주의할 필요가 있습니다. fpm.ini.