PHP5.5.32 버전의 오류 메커니즘 요약
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.

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

PHP와 Python은 각각 고유 한 장점이 있으며 선택은 프로젝트 요구 사항을 기반으로해야합니다. 1.PHP는 간단한 구문과 높은 실행 효율로 웹 개발에 적합합니다. 2. Python은 간결한 구문 및 풍부한 라이브러리를 갖춘 데이터 과학 및 기계 학습에 적합합니다.

PHP는 서버 측에서 널리 사용되는 스크립팅 언어이며 특히 웹 개발에 적합합니다. 1.PHP는 HTML을 포함하고 HTTP 요청 및 응답을 처리 할 수 있으며 다양한 데이터베이스를 지원할 수 있습니다. 2.PHP는 강력한 커뮤니티 지원 및 오픈 소스 리소스를 통해 동적 웹 컨텐츠, 프로세스 양식 데이터, 액세스 데이터베이스 등을 생성하는 데 사용됩니다. 3. PHP는 해석 된 언어이며, 실행 프로세스에는 어휘 분석, 문법 분석, 편집 및 실행이 포함됩니다. 4. PHP는 사용자 등록 시스템과 같은 고급 응용 프로그램을 위해 MySQL과 결합 할 수 있습니다. 5. PHP를 디버깅 할 때 error_reporting () 및 var_dump ()와 같은 함수를 사용할 수 있습니다. 6. 캐싱 메커니즘을 사용하여 PHP 코드를 최적화하고 데이터베이스 쿼리를 최적화하며 내장 기능을 사용하십시오. 7

PHP와 Python은 각각 고유 한 장점이 있으며 프로젝트 요구 사항에 따라 선택합니다. 1.PHP는 웹 개발, 특히 웹 사이트의 빠른 개발 및 유지 보수에 적합합니다. 2. Python은 간결한 구문을 가진 데이터 과학, 기계 학습 및 인공 지능에 적합하며 초보자에게 적합합니다.

PHP는 전자 상거래, 컨텐츠 관리 시스템 및 API 개발에 널리 사용됩니다. 1) 전자 상거래 : 쇼핑 카트 기능 및 지불 처리에 사용됩니다. 2) 컨텐츠 관리 시스템 : 동적 컨텐츠 생성 및 사용자 관리에 사용됩니다. 3) API 개발 : 편안한 API 개발 및 API 보안에 사용됩니다. 성능 최적화 및 모범 사례를 통해 PHP 애플리케이션의 효율성과 유지 보수 성이 향상됩니다.

PHP는 여전히 역동적이며 현대 프로그래밍 분야에서 여전히 중요한 위치를 차지하고 있습니다. 1) PHP의 단순성과 강력한 커뮤니티 지원으로 인해 웹 개발에 널리 사용됩니다. 2) 유연성과 안정성은 웹 양식, 데이터베이스 작업 및 파일 처리를 처리하는 데 탁월합니다. 3) PHP는 지속적으로 발전하고 최적화하며 초보자 및 숙련 된 개발자에게 적합합니다.

PHP는 주로 절차 적 프로그래밍이지만 객체 지향 프로그래밍 (OOP)도 지원합니다. Python은 OOP, 기능 및 절차 프로그래밍을 포함한 다양한 패러다임을 지원합니다. PHP는 웹 개발에 적합하며 Python은 데이터 분석 및 기계 학습과 같은 다양한 응용 프로그램에 적합합니다.

PHP는 특히 빠른 개발 및 동적 컨텐츠를 처리하는 데 웹 개발에 적합하지만 데이터 과학 및 엔터프라이즈 수준의 애플리케이션에는 적합하지 않습니다. Python과 비교할 때 PHP는 웹 개발에 더 많은 장점이 있지만 데이터 과학 분야에서는 Python만큼 좋지 않습니다. Java와 비교할 때 PHP는 엔터프라이즈 레벨 애플리케이션에서 더 나빠지지만 웹 개발에서는 더 유연합니다. JavaScript와 비교할 때 PHP는 백엔드 개발에서 더 간결하지만 프론트 엔드 개발에서는 JavaScript만큼 좋지 않습니다.

PHP와 Python은 고유 한 장점과 단점이 있으며 선택은 프로젝트 요구와 개인 선호도에 달려 있습니다. 1.PHP는 대규모 웹 애플리케이션의 빠른 개발 및 유지 보수에 적합합니다. 2. Python은 데이터 과학 및 기계 학습 분야를 지배합니다.
