PHP5.5.32 버전의 오류 메커니즘 요약

阿神
풀어 주다: 2023-03-03 13:04:01
원래의
1384명이 탐색했습니다.

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("http://www.php.cn/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.

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!