Существует ли путь в PHP для захвата фатальной ошибки, когда макс. время выполнения достигнуто, и дайте пользователю лучшее сообщение?
Попробуйте установить флаг "Готово" после выполнения файла и зарегистрировать функцию выключения, которая будет проверять, определен ли этот флаг
{{1 }}Мой исходный ответ не сработает, так как вы не можете обнаружить фатальную ошибку. Если вы все равно хотите прочитать его, проверьте историю изменений.
Я предполагаю, что вы можете использовать register_shutdown_function
. Установите переменную в начале скрипта, очистите ее, когда скрипт завершится успешно. Напишите функцию, которая проверяет эту переменную и воздействует на нее, если она все еще установлена, затем примените функцию, используя register_shutdown_function
http://php.net/manual/en/function.register-shutdown-function.php
Прочитав здесь первые два ответа, мне пришлось самому протестировать register_shutdown_function ()
- я не думал, что это будет бег. В конце концов, как может выполняться пользовательская функция, если памяти больше нет или время выполнения истекло? Я был удивлен, узнав, что функции выключения выполняются даже в ситуации OOM или когда время выполнения было превышено. Доказательство концепции:
Для проверки предела памяти:
<?php
function asdf() { echo "omg\n"; }
register_shutdown_function('asdf');
ini_set('memory_limit', '1000');
$x = '';
while(true) {
$x .= 'lkajsdlfkjasldkfjlaskdfjasldkfj';
}
Вывод:
PHP Fatal error: Allowed memory size of 262144 bytes exhausted (tried to allocate 169540 bytes) in /home/scratch.php on line 9
PHP Stack trace:
PHP 1. {main}() /home/scratch.php:0
Fatal error: Allowed memory size of 262144 bytes exhausted (tried to allocate 169540 bytes) in /home/scratch.php on line 9
Call Stack:
0.0002 81360 1. {main}() /home/scratch.php:0
omg
Для проверки времени выполнения:
cat scratch.php
<?php
function asdf() { echo "omg\n"; }
register_shutdown_function('asdf');
set_time_limit(1);
while(true) {}
Вывод:
PHP Fatal error: Maximum execution time of 1 second exceeded in /home/scratch.php on line 7
PHP Stack trace:
PHP 1. {main}() /home/scratch.php:0
Fatal error: Maximum execution time of 1 second exceeded in /home/scratch.php on line 7
Call Stack:
0.0002 80200 1. {main}() /home/scratch.php:0
omg
Обратите внимание, что для отображения вашего сообщения перед PHP вывод ошибок, вам придется полностью отключить вывод ошибок PHP. В любом случае, это лучшая практика для производственного сайта.