Я какое-то время играл с обработкой ошибок, и похоже, что она работает по большей части.
function fatalHandler() {
global $fatalHandlerError, $fatalHandlerTitle;
$fatalHandlerError = error_get_last();
if( $fatalHandlerError !== null ) {
print($fatalHandlerTitle="{$fatalHandlerTitle} | ".join(" | ", $fatalHandlerError).
(preg_match("/memory/i", $fatalHandlerError["message"]) ? " | Mem: limit ".ini_get('memory_limit')." / peak ".round(memory_get_peak_usage(true)/(1024*1024))."M" : "")."\n".
"GET: ".var_export($_GET,1)."\n".
"POST: ".var_export($_POST,1)."\n".
"SESSION: ".var_export($_SESSION,1)."\n".
"HEADERS: ".var_export(getallheaders(),1));
}
return $fatalHandlerTitle;
}
function fatalHandlerInit($title="phpError") {
global $fatalHandlerError, $fatalHandlerTitle;
$fatalHandlerTitle = $title;
$fatalHandlerError = error_get_last();
set_error_handler( "fatalHandler" );
}
Теперь у меня есть проблема, когда, если память исчерпана, она не сообщает об этом каждый раз. Кажется, это зависит от того, сколько памяти используется.
Я сделал скрипт для загрузки большого файла (занимает ~ 6.6M памяти) в бесконечном цикле.
Setup1:
ini_set('memory_limit', '296M');
fatalHandlerInit("testing");
$file[] = file("large file"); // copy paste a bunch of times
В этом случае я получаю сообщение об ошибке, и оно умирает при загрузке 45 файлов.
Setup2 - то же самое, но изменить:
ini_set ('memory_limit', '299M');
На этот раз я не получаю сообщение об ошибке, и оно даже не вызывает мою пользовательскую функцию ошибки. Сценарий умирает на одной строке.
Кто-нибудь знает, почему и как это обойти?