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

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

<?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;

?> 

Когда я использую его как есть в его собственном скрипте, он работает и выполняется быстро. Однако, когда я добавляю его в мое существующее приложение, время загрузки страницы уменьшается ДРАМАТИЧЕСКИ, т.е. на 40 секунд, а не на <1 секунду. Может кто-нибудь придумать причину, по которой это может происходить?

10.11.2009 15:58:27
Ваше приложение извергает сотни ошибок уровня NOTICE? Если это так, решение простое: очистите ваш неаккуратный код.
Frank Farmer 10.11.2009 16:42:32
4 ОТВЕТА
РЕШЕНИЕ

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

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

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

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

1
15.11.2009 21:01:29
Согласитесь, если при каждой загрузке страницы возникает 10 ошибок, и для каждой из них обработчик ошибок должен отправить электронное письмо, задержка в 40 секунд может быть проблемой отправки. Проверьте ваш SMTP-сервер или, по моему совету, отредактируйте ваш обработчик ошибок, чтобы отследить все ошибки, но отправьте только 1 электронное письмо в конце скрипта.
Strae 15.11.2009 21:37:15

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

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

0
10.11.2009 16:05:49
Я имею в виду, что, сохранив вышесказанное в своем собственном php-файле и получив к нему доступ в своем веб-браузере, время выполнения сценария значительно меньше времени, добавляемого в мое реальное приложение, когда я включаю в него приведенный выше код.
Bruce the Hoon 12.11.2009 15:38:40

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

0
10.11.2009 16:08:27

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

Набор

log_errors = On
html_errors = Off
error_log = log

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

0
10.11.2009 16:21:13