Внутренние компоненты PHP - какую функцию регистрации ошибок использовать?

Я пишу расширение PHP (хотя его начало очень похоже на расширение zend). Бывают случаи, когда необходимо записать в интерфейс регистрации.

Я вижу, что zend_error() используется в другом месте:

  • чтение исходного кода на github Я нашел zend_error, объявленный в zend/zend.h, но я не смог найти соответствующее определение функции

  • глядя на контексты, в которых используется zend_error, я подозреваю, что вызовы будут перенаправлены/перенаправлены с помощью set_error_handler

Как правило, ведение журнала происходит в MINIT и MSHUTDOWN (где предположительно обработчик ошибок, определенный скриптом, не может иметь никакого влияния), но между ними могут быть и промежутки времени - и я ищу некоторую согласованность. Отсюда попытка понять, как работает механизм.

Можно ли использовать zend_error() в MINIT/MSHUTDOWN?

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

Ответ 1

Ну, я нашел это в PHP Wiki. Я думаю, что это старо, но я думаю, что это все еще относится к Zend3:

Не использовать zend_error

zend_error() следует использовать только внутри движка. Внутри PHP-расширений могут использоваться только функции PHP-ошибок shoudl. Обычно php_error_docref() - лучший выбор. php_error_docref() расширяет сообщение об ошибке дополнительной информацией, например, текущим именем функции и, если необходимо, будет правильно удалять выходные данные. zend_error() используется Zend Engine из-за модульной архитектуры PHP, где Zend Engine и TSRM должны компилироваться без других частей PHP. Следовательно, двигатель не может использовать API уровня PHP. Это ограничение не существует в расширениях.

Это говорит мне, что zend_error был написан для использования в движке и не был разработан как один из инструментов для использования в расширениях. По этой причине вы вряд ли найдете документацию, в которой будут описаны детали, о которых вы просите, и даже если она работает надежно для вас, она не может продолжать это делать.