Как проверить, чист ли выход в функции выключения в PHP?
Как я могу проверить, чист ли выход в функции завершения работы в PHP?
Под чистым выходом я подразумеваю, что скрипт не был прерван из-за ошибки.
4 ответа
Хороший вопрос, на данный момент у меня есть только одна идея: зарегистрировать функцию отключения следующим образом:
function shutdown() {
if (defined('END_REACHED') {
echo 'Script executed with no error', PHP_EOL;
}
}
register_shutdown_function('shutdown');
С auto_append_file
добавьте дополнительный файл в самый конец каждого выполнения скрипта, который устанавливает константу.
Ваш контент auto_append_file.php:
define('END_REACHED', TRUE);
Если вы не хотите редактировать php.ini, вы можете проверить error_get_last()
или же $php_errormsg
в вашем реестре отключение функции!
Вызов error_get_last()
can tell you if or which error occurred. Если функция возвращает NULL
, it is a clean shutdown.
Есть много причин, по которым скрипт может завершиться преждевременно. Универсального решения не существует. Единственными ошибками, которые приводят к преждевременному завершению работы скрипта, являются фатальные ошибки - и в большинстве случаев функция выключения не запускается после фатальной ошибки, аналогично пользовательский обработчик ошибок будет надежно видеть только нефатальные ошибки. Тогда есть возможность настроить обработчики сигналов - но опять-таки они видят только часть истории.
Большой вопрос, конечно, что вы хотите делать с этой информацией в функции выключения?
Единственный надежный способ определить вашу логику, завершенную как положено, - это поднять семафор, когда это происходит, и проверить его в функции выключения.
Я портировал (для PHP 5.3) компонент ezcExecution, который прекрасно справляется с этим. Смотрите https://github.com/sobstel/Execution. По сути, вам нужно сообщить lib, что выход был чистым (вызывая Execution::cleanExit(). В противном случае это означает, что выход не был чистым. Просто так.