From: marc tobias Date: Tue, 21 May 2019 16:37:46 +0000 (+0200) Subject: register shutdown function to handle out-of-memory errors X-Git-Tag: v3.4.0~40^2 X-Git-Url: https://git.openstreetmap.org/nominatim.git/commitdiff_plain/ed2fb84e82270648a3f0ed0a4bd73cb19736b56d register shutdown function to handle out-of-memory errors --- diff --git a/lib/init-website.php b/lib/init-website.php index 67fb52d1..23c15ba8 100644 --- a/lib/init-website.php +++ b/lib/init-website.php @@ -21,6 +21,7 @@ function exception_handler_html($exception) http_response_code($exception->getCode()); header('Content-type: text/html; charset=UTF-8'); include(CONST_BasePath.'/lib/template/error-html.php'); + exit(); } function exception_handler_json($exception) @@ -28,6 +29,7 @@ function exception_handler_json($exception) http_response_code($exception->getCode()); header('Content-type: application/json; charset=utf-8'); include(CONST_BasePath.'/lib/template/error-json.php'); + exit(); } function exception_handler_xml($exception) @@ -36,17 +38,51 @@ function exception_handler_xml($exception) header('Content-type: text/xml; charset=utf-8'); echo ''."\n"; include(CONST_BasePath.'/lib/template/error-xml.php'); + exit(); } +function shutdown_exception_handler_html() +{ + $error = error_get_last(); + if ($error !== null && $error['type'] === E_ERROR) { + exception_handler_html(new Exception($error['message'], 500)); + } +} + +function shutdown_exception_handler_xml() +{ + $error = error_get_last(); + if ($error !== null && $error['type'] === E_ERROR) { + exception_handler_xml(new Exception($error['message'], 500)); + } +} -function set_exception_handler_by_format($sFormat = 'html') +function shutdown_exception_handler_json() { - if ($sFormat == 'html') { + $error = error_get_last(); + if ($error !== null && $error['type'] === E_ERROR) { + exception_handler_json(new Exception($error['message'], 500)); + } +} + + +function set_exception_handler_by_format($sFormat = null) +{ + // Multiple calls to register_shutdown_function will cause multiple callbacks + // to be executed, we only want the last executed. Thus we don't want to register + // one by default without an explicit $sFormat set. + + if (!isset($sFormat)) { + set_exception_handler('exception_handler_html'); + } elseif ($sFormat == 'html') { set_exception_handler('exception_handler_html'); + register_shutdown_function('shutdown_exception_handler_html'); } elseif ($sFormat == 'xml') { set_exception_handler('exception_handler_xml'); + register_shutdown_function('shutdown_exception_handler_xml'); } else { set_exception_handler('exception_handler_json'); + register_shutdown_function('shutdown_exception_handler_json'); } } // set a default