Ошибка максимального времени выполнения захвата Php - PullRequest
12 голосов
/ 21 апреля 2010

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

Ответы [ 4 ]

9 голосов
/ 21 апреля 2010

Прочитав первые два ответа здесь, я должен был сам проверить register_shutdown_function() - я не думал, что он запустится. В конце концов, как пользовательская функция может быть запущена, когда памяти больше нет или время выполнения истекло? Я был удивлен, узнав, что функции выключения do выполняются даже в ситуации 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 голосов
/ 21 апреля 2010

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

3 голосов
/ 21 апреля 2010

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

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

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

0 голосов
/ 17 июля 2013

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

...