
Больнее всего от каких-то часто используемых/общих методов:
PHP Fatal error: Call to a member function smthd() on null in /var/www/some/factory/generic.php on line 13 PHP Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 30148784 bytes) in /var/www/bitrix/modules/main/lib/text/string.php on line 24 |
К сожалению PHP 5.x (в PHP 7.x есть ) не позволяет установить кастомный обработчик для ошибок типа E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR и E_COMPILE_WARNING, обоснованно считая это не безопасным. Поэтому ловить фаталы по аналогии с другими ошибками попросту не выйдет:(
Из всех "не улавливаемых" ошибок наиболее любопытен , а типичное решение этой проблемы - зарегистрировать shutdown-функцию () и там кетчить. Все в целом не так плохо, если вам не интересен stack trace, ибо его на момент вызова shutdown-функции уже нет.
Так родился небольшой PHP-extension , который позволяет прокинуть в user space ошибки типа E_ERROR, что дает возможность обработать их нужным образом (i.e. сохранить) и достойно "умереть". Стоит предупредить, что тут важно понимать что вы делаете и имплементить крайне аккуратно, ибо PHP обоснованно считает прокидывание ошибок этого типа не безопасным.
Собирается как и любое другое расширения (детально описано в README)
Пример использования:
fatal_error_handler(function($code, $message, $file, $line) {
echo "Args: \n";
var_dump(func_get_args());
echo "Trace: \n";
debug_print_backtrace();
});
function test_error() {
fatal();
}
test_error(); |
Args:
array(4) {
[0]=>
int(1)
[1]=>
string(34) "Call to undefined function fatal()"
[2]=>
string(26) "/home/buglloc/tmp/test.php"
[3]=>
int(10)
}
Trace:
#0 {closure}(1, Call to undefined function fatal(), /home/buglloc/tmp/test.php, 10) called at [/home/buglloc/tmp/test.php:10]
#1 test_error() called at [/home/buglloc/tmp/test.php:13] |
<?php
require_once __DIR__ . '/handler.php';
$handler = new ErrorHandler;
$handler->register();
function foo() {
fatal();
}
function bar() {
foo();
}
// warning
strpos();
// fatal
bar(); |
E_WARNING: strpos() expects at least 2 parameters, 0 given in /home/buglloc/work/projects/php-fatal-handler/demo/test.php:16
#1 /home/buglloc/work/projects/php-fatal-handler/demo/test.php(16): strpos()
#2 {main}
E_ERROR: Call to undefined function fatal() in /home/buglloc/work/projects/php-fatal-handler/demo/test.php:9
#1 /home/buglloc/work/projects/php-fatal-handler/demo/test.php(13): foo()
#2 /home/buglloc/work/projects/php-fatal-handler/demo/test.php(19): bar()
#3 {main}
Ooops |
Расширение должно работать со всей линейкой поддерживаемых версий PHP от 5.3 до 5.6, в том числе и с ZTS. За счет минимального оверхеда можно использовать в продакшене не боясь за производительность.
Если будут какие-то вопросы, предложения, замечания можете адресовать их в
Всем благ;)