我有一个正在制作的脚本 - 一个电子商务结帐页面 - 过去有一些错误导致它无法正常工作并且花了我钱。我希望收到有关错误的通知,所以我就这样做了:
<?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秒。任何人都可以想到这可能发生的原因吗?
答案 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中。