재인쇄 시 출처를 표시해 주세요. PHP의 잘못된 구성에 대해 무엇을 알아야 합니까? PHP의 오류 메커니즘 요약(재인쇄)
// 엄격한 표준: 17행의 /tmp/php/index.php에서 변수만 참조로 전달되어야 합니다. functionchange(&$var) {
$var += 10 ;
}
$var = 1;
change(++$var);// E_STRICT
E_RECOVERABLE_ERROR
이 수준은 실제로 ERROR 수준이지만 오류 처리에 의해 발견되지 않으면 E_ERROR와 동일하게 동작합니다.
형식 매개변수가 유형을 정의했지만 호출 시 잘못된 유형이 전달되는 경우가 자주 발생합니다. 오류 알림에는 E_ERROR의 치명적인 오류 앞에 Catachable이라는 단어도 있습니다.
//Catchable 치명적인 오류: testCall()에 전달된 인수 1은 A의 인스턴스, B의 인스턴스가 제공되어야 하며 37행의 /tmp/php/index.php에서 호출되고 /tmp/php/index에 정의되어야 합니다. .php 온라인 33class A {
}class B {
}function testCall(A $a) {
}
$b = new B();
testCall($b);
E_DEPRECATED
이 오류는 이전 버전의 함수를 사용하고 있으며 이 함수의 이후 버전이 비활성화되거나 유지되지 않을 수 있음을 의미합니다.
예를 들어, 컬의 CURLOPT_POSTFIELDS는 @FILENAME을 사용하여 파일을 업로드합니다.
// 더 이상 사용되지 않음: 컬_setopt(): 파일 업로드를 위한 @filename API 사용은 더 이상 사용되지 않습니다. /tmp/php /에서 대신 CURLFile 클래스를 사용하십시오. index.php 온라인 42$ch = cur_init("http://www.remotesite.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("0으로 나눌 수 없습니다", 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의 구성 파일입니다. fpm.php-fpm.conf.
php.ini 구성
error_reporting = E_ALL // 오류 수준, 수준 보고 error_log = /tmp/php_errors.log // php에서 오류 표시 위치를 기록합니다. display_errors = On // 오류 표시 여부 표시 출력, 이 출력은 페이지일 수도 있고 stdoutdisplay_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 fallCode 요소의 값으로 사용됩니다. 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
//주의사항: 정의되지 않은 변수: 20행의 /tmp/php/index.php에 있는 c
두 번 나왔을 텐데 지금은 한 번만 나오네요...
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 = 주의 // php-fpm 자체 로그 Logging level php_flag[display_errors] = off // php.ini의 구성 변수를 재정의합니다. 이는 프로그램의 ini_set으로 재정의할 수 있습니다. php_value[display_errors] = off // php_flagphp_admin_value[error_log] = /tmp/www-error.log와 같습니다. // php.ini의 구성 변수를 덮어쓰며 프로그램의 ini_set으로 재정의할 수 없습니다. php_admin_flag[log_errors] = on // php_admin_valuecatch_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.