Php, захватывающий максимальную ошибку времени выполнения

Существует ли путь в PHP для захвата фатальной ошибки, когда макс. время выполнения достигнуто, и дайте пользователю лучшее сообщение?

12
задан Cœur 10 December 2017 в 04:01
поделиться

3 ответа

Попробуйте установить флаг "Готово" после выполнения файла и зарегистрировать функцию выключения, которая будет проверять, определен ли этот флаг

{{1 }}
3
ответ дан 2 December 2019 в 20:40
поделиться

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

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

http://php.net/manual/en/function.register-shutdown-function.php

3
ответ дан 2 December 2019 в 20:40
поделиться

Прочитав здесь первые два ответа, мне пришлось самому протестировать 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. В любом случае, это лучшая практика для производственного сайта.

9
ответ дан 2 December 2019 в 20:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: