Перенаправление на другую страницу при возникновении фатальной ошибки

Я получаю следующую фатальную ошибку в приложении, над которым сейчас работаю.

Неустранимая ошибка: разрешенный размер памяти 134217728 байт исчерпан (попытка выделить 1245184 байта) в C:\xampp\htdocs\myproject\vendor\tecnickcom\tcpdf\tcpdf.php в строке 7317

Предупреждение: unlink(./Logo.jpg): Нет такого файла или каталога в C:\xampp\htdocs\myproject\vendor\tecnickcom\tcpdf\tcpdf.php в строке 7801

Что я хочу сделать, так это перенаправить на другую страницу при возникновении фатальной ошибки. Ниже приведен код, с которым я играю, но не повезло.

set_time_limit(0);
use Spipu\Html2Pdf\Html2Pdf;

try {
    ...
    } catch (Throwable $e) {
        header('Location: http://localhost:8080/docs/generate.php'); exit;
}

Проблема здесь в том, что перенаправление не происходит при фатальной ошибке.

Пожалуйста, порекомендуйте.


person Covert    schedule 12.12.2019    source источник
comment
Я думаю, это невозможно. Когда вы используете всю доступную память, нет возможности выполнить больше инструкций, событие создает новый объект Throwable для представления исключения.   -  person VirCom    schedule 12.12.2019


Ответы (1)


Вы не можете поймать фатальные ошибки в PHP. Но есть обходной путь, который может быть полезен в вашем случае.

Вы можете зарегистрировать обратный вызов при завершении работы, используя register_shutdown_function.

register_shutdown_function(function() {
    require_once dirname(__FILE__) . '/file.php'; // use ABSOLUTE path
    die();
});

Вам может быть интересно перенаправить пользователей на другую страницу с помощью header вместо включения file.php и остановить выполнение скрипта. Ну, вы получите предупреждение:

Невозможно изменить информацию заголовка — заголовки уже отправлены...

Поскольку вы не можете отправить какой-либо HTTP-заголовок в обратном вызове выключения.

person N'Bayramberdiyev    schedule 12.12.2019
comment
from php.net - Если вы хотите что-то сделать с файлами в функции, которая зарегистрирована в register_shutdown_function(), используйте АБСОЛЮТНЫЕ пути к файлам вместо относительных. Потому что, когда обработка скрипта завершена, текущий рабочий каталог меняется на ServerRoot Поэтому при перенаправлении нам нужно что-то вроде - require_once(dirname(FILE).'/полный путь к файлу/file.php');die; - person Angel Deykov; 12.12.2019