设置自定义错误处理程序会大大增加脚本执

时间:2009-11-10 15:58:28

标签: php email error-handling

我有一个正在制作的脚本 - 一个电子商务结帐页面 - 过去有一些错误导致它无法正常工作并且花了我钱。我希望收到有关错误的通知,所以我就这样做了:

<?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秒。任何人都可以想到这可能发生的原因吗?

4 个答案:

答案 0 :(得分:1)

如果您有大量流量而且丢失了大量错误,则写入日志会导致大量磁盘IO。这可能会使您的应用程序变慢到您正在谈论的程度。

也许你投掷的不是错误,而是一堆通知“例外”。如果你将它们设置为不显示(大多数PHP版本中的默认设置)并且你正在加载它们,那么你可能会运行错误处理程序数百次。每次运行处理程序时,它都必须执行跟踪,突破当前作用域,执行各种处理,如果这一切都发生,因为您在PHP 5.3中使用=& new或尝试访问undefined数组元素(或任何其他常见的通知),你会看到那种延迟。

因此,为了解决这个问题,医生会规定关闭测试服务器上的错误处理程序,打开通知显示,运行流程并记下任何错误/通知/等,然后修复上述通知在您的生产箱上。

希望这有帮助!

答案 1 :(得分:0)

嗯。当你说“在它自己上面使用它”时,你的意思是在一个通过Apache调用的单独页面中,还是在命令行上运行它?延迟与电子邮件的使用相结合,使我怀疑DNS或网络问题......无法解决或无法连接和超时。

另一个想法......在这个运行过程中启动Xdebug并进行配置文件转储,看看是否能够解决所有时间的问题。

答案 2 :(得分:0)

尝试在exit()来电后添​​加error_log()

答案 3 :(得分:0)

如果您遇到error_hander问题,则另一种解决方案是登录文件:

设置

log_errors = On
html_errors = Off
error_log = log
在您的php.ini中

,然后所有错误都将记录到服务器的默认error.log中。