Настройка настраиваемого обработчика ошибок значительно увеличивает время выполнения скрипта

У меня есть сценарий в производстве – страница проверки электронной торговли, которая в прошлом имела некоторые ошибки, которые мешали ей работать и стоили мне денег. Я хотел получить уведомление об ошибках, поэтому я работал над этим:

<?php function mailErrorHandler($errno, $errstr) { echo "<!--PHP ERROR:"; echo "---[$errno] $errstr ---"; echo "-->"; error_log("Error: [$errno] $errstr",1, "myemail@myserver.com","From: me@workserver.com"); } set_error_handler("mailErrorHandler",E_ALL); echo 1-thisisnotanumber; ?> 

Когда я использую его как есть в своем собственном скрипте, он работает и выполняется быстро. Однако, когда я добавляю его в существующее приложение, время загрузки страницы уменьшается DRAMATICALLY, т.е. 40 секунд, а не <1 секунда. Может ли кто-нибудь подумать о причине, почему это может произойти?

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

Возможно, то, что вы бросаете, это не ошибки, а скорее куча уведомлений «исключения». Если вы настроили их не отображаться (по умолчанию в большинстве версий PHP), и вы получаете их на лодке, вы можете запускать обработчик ошибок сотни и сотни раз. Каждый раз, когда обработчик запускается, он должен делать трассировку, выходить из текущей области, делать все виды обработки, и если это все происходит, потому что вы используете =& new с PHP 5.3 или пытаетесь получить доступ к неопределенным элементам массива (или любое другое общее уведомление), вы увидите эти задержки.

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

Надеюсь это поможет!

Хм. Когда вы говорите «использовать его на своем собственном», вы имеете в виду на отдельной странице, которая вызывается через Apache, или вы запускаете ее в командной строке? Задержка в сочетании с использованием электронной почты заставляет меня подозревать проблему с DNS или сетью … что-то не разрешает или не связывает и не синхронизирует время.

Еще одна мысль … запустите Xdebug и сделайте дамп профиля, пока он работает, и посмотрите, не проливает ли свет на то, что занимает все время.

Попробуйте добавить exit() после вызова error_log() .

Другим решением является запись в файл, если у вас есть проблемы с error_hander:

Задавать

 log_errors = On html_errors = Off error_log = log 

в вашем php.ini, то все ошибки будут занесены в файл error.log по умолчанию на вашем сервере.