Установка пользовательского обработчика ошибок значительно увеличивает время выполнения скрипта - PullRequest
1 голос
/ 10 ноября 2009

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

<?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 секунды. Может кто-нибудь придумать причину, по которой это может происходить? </p>

Ответы [ 4 ]

1 голос
/ 16 ноября 2009

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

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

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

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

0 голосов
/ 10 ноября 2009

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

0 голосов
/ 10 ноября 2009

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

Набор

log_errors = On
html_errors = Off
error_log = log

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

0 голосов
/ 10 ноября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...