为了账号安全,请及时绑定邮箱和手机立即绑定

如何通过电子邮件发送所有 PHP 异常/错误的详细信息,包括 mysqli 的?

如何通过电子邮件发送所有 PHP 异常/错误的详细信息,包括 mysqli 的?

PHP
慕后森 2023-05-26 17:12:15
如何获得所有 PHP 异常,包括 mysqli 生成的异常和普通 php 异常,并通过电子邮件发送给我?问题环境我在我的 ISP 处使用共享服务器,无法访问任何管理类型的 PHP 配置文件。在服务器上,我只有大约一百行 PHP 来对 MySQL 数据库执行查询,如果返回任何行,它会执行一些 SQL UPDATE 命令。这作为 cron 作业每天运行。没有关联的网站(我在该服务器上什至没有网站)。服务器托管一个用于远程连接的数据库,而 php 只是对其执行一些维护。由于没有“用户”和“网页”来提供反馈,我希望所有错误和异常都通过电子邮件发送给我。我尝试/研究过的事情我发现mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);将通常导致返回 FALSE 的 mysqli 错误转换为将写入错误日志的异常。这有帮助。...我可以使用例如电子邮件发送文本$email = "my message";Error_log($email, 1, "myemailaddress@myserver.com", "From: defaultemail@hostingserver.com");  并且我可以通过编写自己的错误处理程序来获取错误的详细信息,例如function the_error_handler($number, $message, $file, $line, $vars) //putting $vars in shows all the variables the server knows about{    $email = " An error ($number) occurred on line $line in $file.  $message ";    Error_log($email, 1, "myemailaddress@myserver.com", "From: defaultemail@hostingserver.com");    };并使用它进行设置set_error_handler('the_error_handler'); 最小的,可重现的例子在下面的代码中,我将所有这些放在一起并故意引入了两个错误(试图回显一个不存在的变量并试图在一个不存在的表上执行查询。
查看完整描述

1 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

首先,我必须警告您,在一个向公众开放的实时站点上,电子邮件错误可能会淹没您的邮箱,以防万一出现严重故障,因为对站点的每个请求都会导致发送一封不同的电子邮件。在我工作的公司中,这种情况不止一次发生过。有时很难在错误的瀑布中找到真正的原因。

监控服务器日志被认为是更安全和准确的解决方案。事实证明,在错误日志上使用 Grep 比浏览电子邮件更有效。但无论哪种方式,这里的问题是如何统一处理所有错误,而处理程序中采取的操作可以是任何操作。

错误和异常是不同的野兽,每个都有自己的处理程序。因此,要使错误处理统一,您必须首先将错误转换为异常,然后在异常处理程序中执行所需的处理,无论它是什么——日志记录、电子邮件或任何东西。

因此,您将需要本文中介绍的两个功能,即简单地将错误转换为异常的错误处理程序,

set_error_handler(function ($level, $message, $file = '', $line = 0)

{

    throw new ErrorException($message, 0, $level, $file, $line);

});

和这样的异常处理程序


set_exception_handler(function ($e)

{

    error_log($e);

    http_response_code(500);

    if (ini_get('display_errors')) {

        echo $e;

    } else {

        error_log($e, 1, "myemailaddress@myserver.com", "From: defaultemail@hostingserver.com");

        echo "<h1>500 Internal Server Error</h1>

              An internal server error has been occurred.<br>

              Please try again later.";

    }

});

每次发生错误并且代码在实时站点上运行时,它都会向您发送一封电子邮件。


此外,您可能希望添加一个致命错误处理程序,它可能有助于处理同名错误。可以在文章中看到所有三个处理程序组合在一起的完整示例。


关于mysqli,你是绝对正确的,下面一行


 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

将告诉 mysqli 抛出异常,这些异常将由上面定义的处理程序处理。


查看完整回答
反对 回复 2023-05-26
  • 1 回答
  • 0 关注
  • 140 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信