PHP : 사용자 정의 오류 처리기 - 구문 분석 및 치명적 오류 처리
사용자 정의 오류 처리기를 사용하여 구문 분석 및 치명적인 오류를 처리하려면 어떻게 해야 합니까?
실제로 구문 분석 및 치명적인 오류를 처리할 수 있습니다.set_error_handler()로 정의한 오류 처리기 함수는 호출되지 않는 것이 사실입니다.이 방법은 register_shutdown_function()으로 종료 함수를 정의하는 것입니다.다음은 제 웹사이트에서 작업한 내용입니다.
파일 prepend.php(이 파일은 모든 php 스크립트에 자동으로 추가됩니다.)PHP에 파일을 추가하는 데 필요한 팁은 아래를 참조하십시오.
set_error_handler("errorHandler");
register_shutdown_function("shutdownHandler");
function errorHandler($error_level, $error_message, $error_file, $error_line, $error_context)
{
$error = "lvl: " . $error_level . " | msg:" . $error_message . " | file:" . $error_file . " | ln:" . $error_line;
switch ($error_level) {
case E_ERROR:
case E_CORE_ERROR:
case E_COMPILE_ERROR:
case E_PARSE:
mylog($error, "fatal");
break;
case E_USER_ERROR:
case E_RECOVERABLE_ERROR:
mylog($error, "error");
break;
case E_WARNING:
case E_CORE_WARNING:
case E_COMPILE_WARNING:
case E_USER_WARNING:
mylog($error, "warn");
break;
case E_NOTICE:
case E_USER_NOTICE:
mylog($error, "info");
break;
case E_STRICT:
mylog($error, "debug");
break;
default:
mylog($error, "warn");
}
}
function shutdownHandler() //will be called when php script ends.
{
$lasterror = error_get_last();
switch ($lasterror['type'])
{
case E_ERROR:
case E_CORE_ERROR:
case E_COMPILE_ERROR:
case E_USER_ERROR:
case E_RECOVERABLE_ERROR:
case E_CORE_WARNING:
case E_COMPILE_WARNING:
case E_PARSE:
$error = "[SHUTDOWN] lvl:" . $lasterror['type'] . " | msg:" . $lasterror['message'] . " | file:" . $lasterror['file'] . " | ln:" . $lasterror['line'];
mylog($error, "fatal");
}
}
function mylog($error, $errlvl)
{
...do whatever you want...
}
PHP는 스크립트 중 하나에서 오류가 발견되면 functionhandler()를 호출합니다.오류로 인해 스크립트가 즉시 종료되는 경우 오류는 function shutdownHandler()에 의해 처리됩니다.
이것은 제가 개발 중인 사이트에서 작동하고 있습니다.저는 그것을 생산에서 아직 테스트하지 않았습니다.하지만 현재 개발 중인 오류를 모두 파악하고 있습니다.
각 기능별로 한 번씩 두 번씩 동일한 오류가 발생할 위험이 있다고 생각합니다.함수 shutdownHandler()에서 처리 중인 오류가 functionerrorHandler()에서도 발견된 경우 이 문제가 발생할 수 있습니다.
작업관리:
1 - 오류를 우아하게 처리하기 위해 더 나은 log() 기능을 사용해야 합니다.저는 아직 개발 중이기 때문에 기본적으로 데이터베이스에 오류를 기록하고 화면에 반향을 일으키고 있습니다.
2 - 모든 MySQL 호출에 대한 오류 처리 구현
3 - 내 자바스크립트 코드에 대한 오류 처리 구현.
중요 참고 사항:
1 - 위 스크립트를 모든 php 스크립트에 자동으로 추가하기 위해 php.ini에서 다음 행을 사용하고 있습니다.
auto_prepend_file = "/homepages/45/d301354504/htdocs/hmsee/cgi-bin/errorhandling.php"
잘 작동합니다.
2 - 저는 E_STRICT 오류를 포함한 모든 오류를 기록하고 해결하고 있습니다.저는 깨끗한 코드를 개발하는 것을 믿습니다.개발 중에 내 php.ini 파일은 다음 행을 가집니다.
track_errors = 1
display_errors = 1
error_reporting = 2147483647
html_errors = 0
제가 라이브를 시작할 때, 저는 제 사용자가 추한 PHP 오류 메시지를 볼 위험을 줄이기 위해 display_errors를 0으로 변경할 것입니다.
이것이 누군가에게 도움이 되길 바랍니다.
간단한 답변:그럴수는 없어요.설명서 참조:
사용자 정의 함수로 E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPLE_ERROR, E_COMPLE_WARNING 및 set_error_handler()가 호출되는 파일에서 발생한 대부분의 E_STRICT 유형을 처리할 수 없습니다.
다른 모든 오류에 대해 다음을 사용할 수 있습니다.set_error_handler()
편집:
왜냐하면, 이 주제에 대한 논의가 있기 때문에, 사용과 관련하여.register_shutdown_function
처리의 정의를 살펴봐야 합니다.오류를 처리하는 것은 오류를 파악하고 사용자와 기본 데이터(데이터베이스, 파일, 웹 서비스 등)에 "좋은" 방식으로 대응하는 것을 의미합니다.
용사를 합니다.register_shutdown_function
호출된 코드 내에서 오류를 처리할 수 없습니다. 즉, 오류가 발생한 지점에서 코드가 계속 작동하지 않습니다.그러나 화이트 페이지 대신 오류 메시지를 사용자에게 표시할 수는 있지만, 예를 들어 코드가 실패하기 전에 수행한 작업을 롤백할 수는 없습니다.
다음과 같은 코드를 사용하여 이러한 오류를 추적할 수 있습니다.
구문 분석 오류는 다음을 통해 다른 스크립트 파일에서 발생하는 경우에만 발견할 수 있습니다.include()
또는require()
이 를 는또이코입로써으력함를드▁an써에 으로써.auto_prepend_file
다른 답변들이 언급했듯이.)
function shutdown() {
$isError = false;
if ($error = error_get_last()){
switch($error['type']){
case E_ERROR:
case E_CORE_ERROR:
case E_COMPILE_ERROR:
case E_USER_ERROR:
$isError = true;
break;
}
}
if ($isError){
var_dump ($error);//do whatever you need with it
}
}
register_shutdown_function('shutdown');
PHP.net 페이지에 있는 http://www.php.net/manual/en/function.set-error-handler.php 의 주석.
여기 있는 몇몇 사람들이 당신이 구문 분석 오류(타입 4, E_PARSE)를 캡처할 수 없다고 언급했다는 것을 깨달았습니다.이것은 사실이 아닙니다.제가 하는 일은 이렇습니다.이것이 누군가에게 도움이 되길 바랍니다.
웹 루트에 "auto_prepend.php" 파일을 만들고 다음을 추가합니다.
<?php
register_shutdown_function('error_alert');
function error_alert()
{
if(is_null($e = error_get_last()) === false)
{
mail('your.email@example.com', 'Error from auto_prepend', print_r($e, true));
}
}
?>
그런 다음 이 "php_value auto_prepend_file /www/auto_prepend.php"를 웹 루트의 .htaccess 파일에 추가합니다.
- 전자 메일 주소와 파일 경로를 변경해야 합니다.
제 경험상 모든 유형의 오류를 감지하고, 기본 오류 메시지를 숨기고, 원하는 경우 자신의 오류 메시지를 표시할 수 있습니다.아래에는 당신이 필요로 하는 것들이 나열되어 있습니다.
는 초최/상위레스트립크, 호합니다출이를벨라고 부릅니다.index.php
사용자 지정 오류 처리기 함수를 저장할 수 있습니다.사용자 지정 오류 함수 처리기는 포함된 파일에서 "아래"를 의미하는 아래의 오류를 감지하려면 맨 위에 있어야 합니다.
탑! 합니다. 은 이최위스참합니다야다중니매합요이우것은이가정어은다없는오에서 수 . 치명적인 오류를 잡을 수 없습니다.index.php
가 용자정오처함다경발우견에 있을 때index.php
.
PHP 지시어(또한 다음에서 확인해야 함)index.php
)set_error_handler("myNonFatalErrorHandler");
# 오류를 #치명적인 오류를 잡기 #치명적인 오류가 발생했습니다register_shutdown_function('myShutdown');
#치명적인 실수를 저지르기 위해ini_set('display_errors', false);
# php에 의해 사용자에게 표시된 오류를 숨기기 위해.ini_set('log_errors',FALSE);
#우리 스스로 오류를 기록합니다.ini_set('error_reporting', E_ALL);
#우리는 모든 오류를 보고합니다.
생산 중(내가 틀리지 않다면) 우리는 떠날 수 있습니다.ini_set('error_reporting', E_ALL);
오류를 기록할 수 있도록 동시에ini_set('display_errors', false);
에서는 사용자에게 오류가 표시되지 않도록 합니다.
제가 말하는 두 가지 기능의 실제 내용에 대해서는,myNonFatalErrorHandler
그리고.myShutdown
저는 단순한 것을 유지하기 위해 여기에 세부적인 내용을 넣지 않습니다.게다가 다른 방문객들은 많은 예를 들었습니다.저는 아주 간단한 생각을 보여줄 뿐입니다.
function myNonFatalErrorHandler($v, $m, $f, $l, $c){
$some_logging_var_arr1[]="format $v, $m, $f, ".$err_lvl[$l].", $c the way you like";
//You can display the content of $some_logging_var_arr1 at the end of execution too.
}
function myShutdown()
{
if( ($e=error_get_last())!==null ){
$some_logging_var_arr2= "Format the way you like:". $err_level[$e['type']].$e['message'].$e['file'].$e['line'];
}
//display $some_logging_var_arr2 now or later, e.g. from a custom session close function
}
$err_lvl의 경우 다음과 같습니다.
$err_lvl = array(E_ERROR=>'E_ERROR', E_CORE_ERROR=>'E_CORE_ERROR', E_COMPILE_ERROR=>'E_COMPILE_ERROR', E_USER_ERROR=>'E_USER_ERROR', E_PARSE=>'E_PARSE', E_RECOVERABLE_ERROR=>'E_RECOVERABLE_ERROR', E_WARNING=>'E_WARNING', E_CORE_WARNING=>'E_CORE_WARNING', E_COMPILE_WARNING=>'E_COMPILE_WARNING',
E_USER_WARNING=>'E_USER_WARNING', E_NOTICE=>'E_NOTICE', E_USER_NOTICE=>'E_USER_NOTICE',E_STRICT=>'E_STRICT');
구문 분석 오류가 있는 스크립트는 항상 중단되므로 처리할 수 없습니다.따라서 스크립트를 직접 호출하거나 포함/요구를 통해 호출하는 경우에는 수행할 수 있는 작업이 없습니다.그러나 AJAX, 플래시 또는 다른 방법으로 호출되는 경우 구문 분석 오류를 탐지하는 방법에 대한 해결 방법이 있습니다.
저는 swupload 스크립트를 처리하기 위해 이것이 필요했습니다.Swupload는 파일 업로드를 처리하는 플래시이며 파일이 업로드될 때마다 PHP 처리 스크립트를 호출하여 파일 데이터를 처리하지만 브라우저 출력이 없으므로 PHP 처리 스크립트에는 디버깅 목적으로 다음 설정이 필요합니다.
- 경고 및 알림 ob_start(), 시작 시에는 ob_get_start(), 처리 스크립트 끝에 다음과 같이 내용을 세션에 저장합니다.다른 스크립트에서 브라우저에 표시할 수 있습니다.
- 치명적 오류 레지스터_register_function()은 위와 동일한 트릭으로 세션을 설정합니다.
- ob_get_parse"가 처리 스크립트의 끝에 있고 이전에 parse 오류가 발생한 경우 세션이 채워지지 않습니다(null입니다).디버깅 스크립트는 다음과 같은 방법으로 처리할 수 있습니다.
if(!isset($_SESSION["swfupload"])) echo "parse error";
1트노 1▁1 null
은 단입니다.is not set
isset()
언급URL : https://stackoverflow.com/questions/1900208/php-custom-error-handler-handling-parse-fatal-errors
'programing' 카테고리의 다른 글
Apache2 Maria DB가 있는 웹 서버에서 오류가 발생했습니다. 요청한 URL을 찾을 수 없습니다. (0) | 2023.09.02 |
---|---|
해당 열의 값 또는 하위 배열을 포함하는 모든 레코드를 가져오는 방법은 무엇입니까? (0) | 2023.09.02 |
테이블 만들기 쿼리를 실행하는 동안 오류 1064가 발생합니까? (0) | 2023.09.02 |
mysql에서 mariadb로 mysqdump - 데이터베이스 크기 차이 (0) | 2023.09.02 |
Linkq-to-SQL 시간 초과 (0) | 2023.09.02 |