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