치명적인 예외가 발생했을 때 php가 500을 반환하도록 하려면 어떻게 해야 합니까?
PHP 치명적인 오류는 HTTP 클라이언트에 상태 코드 200으로 반환됩니다.상태 코드 500(내부 서버 오류)을 반환하려면 어떻게 해야 합니까?
header("HTTP/1.1 500 Internal Server Error");
이것이 바로 제가 어제 겪었던 문제이고 저는 다음과 같은 해결책을 찾았습니다.
우선, 당신은 PHP 치명적인 오류를 잡아야 합니다. 이것은 오류 유형 E_ERROR입니다. 이 오류가 발생하면 스크립트는 오류를 저장하고 실행을 종료합니다.함수 error_get_last를 호출하면 저장된 오류를 얻을 수 있습니다.
스크립트가 종료되기 전에 콜백 함수 레지스터_callback_function()이 항상 호출됩니다.따라서 이 함수를 사용하여 오류 처리기를 등록해야 원하는 작업을 수행할 수 있습니다. 이 경우에는 헤더 500을 반환하고 사용자 지정된 내부 오류 페이지(옵션)를 사용할 수 있습니다.
function my_error_handler()
{
$last_error = error_get_last();
if ($last_error && $last_error['type']==E_ERROR)
{
header("HTTP/1.1 500 Internal Server Error");
echo '...';//html for 500 page
}
}
register_shutdown_function('my_error_handler');
참고: E_USER*로 시작하는 사용자 정의 오류 유형을 탐지하려면 set_error_handler() 함수를 사용하여 오류 처리기를 등록하고 trigger_error로 오류를 트리거할 수 있지만 이 오류 처리기는 E_ERROR 오류 유형을 처리할 수 없습니다.오류 처리기에 대한 설명은 php.net 을 참조하십시오.
표준 PHP 구성은 오류가 발생할 때 500을 반환합니다!display_module =가 꺼져 있는지 확인하십시오.다음을 사용하여 시뮬레이션할 수 있습니다.
ini_set('display_errors', 0);
noFunction();
운영 시 display_errors 지시어는 기본적으로 해제되어 있습니다.
PHP >= 5.4 이후
http_response_code(500);
echo json_encode( [ 'success' => false , 'message' => 'Crazy thing just happened!' ]);
exit();
이전에 httpCode를 설정하십시오.echo
.
"set_exception_handler"를 사용하여 감지되지 않은 예외를 처리했습니다.
function handleException($ex) {
error_log("Uncaught exception class=" . get_class($ex) . " message=" . $ex->getMessage() . " line=" . $ex->getLine());
ob_end_clean(); # try to purge content sent so far
header('HTTP/1.1 500 Internal Server Error');
echo 'Internal error';
}
set_exception_handler('handleException');
PHP 문서에 따라 PHP E_ERROR를 어떤 방식으로도 처리할 수 없습니다. http://www.php.net/manual/en/function.set-error-handler.php
또한 해당 링크에 따라 "E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMFILE_ERROR, E_COMFILE_WARNING 및 대부분의 E_STRICT"를 처리할 수 없습니다.
E_USER_ERROR를 포함한 다른 오류, 경고 및 알림에 대한 핸들러를 제공할 수 있지만, 이 오류는 프로그래머가 trigger_error()와 함께 의도적으로 느려지기 때문에 실제로는 그렇게 유용하지 않습니다.
그리고 물론 예외(네이티브 PHP 함수에 의해 던져진 예외도)를 잡을 수 있습니다.
저는 이것이 문제라는 것에 동의합니다.서버는 응용 프로그램 코드가 충돌하고 구워질 때 200 OK를 반환하지 않아야 합니다.
php 오류 처리를 사용할 수 있습니다.
http://www.w3schools.com/php/php_error.asp
try/catch를 사용하여 느려진 오류를 잡은 다음 해당 catch 블록을 사용하여 500 오류가 있는 헤더()를 전송해야 합니다.
try {
...badcode...
throw new Exception('error');
} catch (Exception $e) {
header("Status: 500 Server Error");
var_dump($e->getMessage());
}
가 try {} 있지 하고 {}을(를) .register_shutdown_function()
스크립트 끝에서 오류를 확인합니다.
설정하는 것을 잊지 마십시오.header("HTTP/1.1 200 OK", true, 200);
실행 경로의 마지막 줄로 지정:
//first things first:
header("HTTP/1.1 500 Internal Server Error", true, 500);
//Application code, includes, requires, etc. [...]
//somewhere something happens
//die();
throw new Exception("Uncaught exception!");
//last things last, only reached if code execution was not stopped by uncaught exception or some fatal error
header("HTTP/1.1 200 OK", true, 200);
PHP 5.4
▁the다를 대체할 수 .header
훨씬 더 나은 또는 .로 위에서 기능합니다.
치명적인 오류(예: 누락된 세미콜론)를 처리할 때 어려운 점은 스크립트가 실행되지 않기 때문에 해당 스크립트에서 상태 코드를 설정하는 데 도움이 되지 않는다는 것입니다.그러나 스크립트를 포함하거나 필요한 경우 포함된 스크립트의 오류에 관계없이 호출 스크립트가 실행됩니다.이를 통해 저는 다음과 같은 해결책을 얻었습니다.
판에 박은php:
// minimize changes to this script to keep it rock-solid
http_response_code(500); // PHP >= 5.4
require_once("script-i-want-to-guard-for-errors.php");
스크립트-i-to-guard-to-guard-for-for-discript.php:
// do all the processsing
// don't produce any output
// you might want to use output buffering
http_response_code(200); // PHP >= 5.4
// here you can produce the output
당신의 전화를 록솔리드 스크립트로 돌리세요.php 그러면 당신은 갈 준비가 되었습니다.
.htaccess에서 기본 상태 코드를 500으로 설정하는 것이 더 좋았을 것입니다.제가 보기엔 그게 더 우아해 보이는데 어떻게 해야 할지 모르겠어요.RewriteRule R-flag를 시도해봤지만, 이것은 php의 실행을 완전히 방해하기 때문에 소용이 없습니다.
언급URL : https://stackoverflow.com/questions/1555862/how-can-i-get-php-to-return-500-upon-encountering-a-fatal-exception
'programing' 카테고리의 다른 글
클래스가 2개인 요소를 선택하는 방법 (0) | 2023.07.28 |
---|---|
나란히 2개의 다이브 - 유체 디스플레이 (0) | 2023.07.28 |
매일 같은 시간에 작업을 수행하는 Python 스크립트 (0) | 2023.07.28 |
검색 엔진 Lucene 대 데이터베이스 검색 (0) | 2023.07.28 |
iframe은 왜 이렇게 느립니까? (0) | 2023.07.28 |