Подтвердить что ты не робот

Максимальная ошибка времени захвата Php

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

Если нет способа уловить ошибку с уровня API, PHP-движок должен иметь возможность выгружать память на hdd всякий раз, когда возникает фатальная ошибка, например, что делает Windows, когда вы видите "синий экран".