猿问

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

如何获得所有 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'); 

最小的,可重现的例子


在下面的代码中,我将所有这些放在一起并故意引入了两个错误(试图回显一个不存在的变量并试图在一个不存在的表上执行查询。


慕后森
浏览 141回答 1
1回答

翻阅古今

首先,我必须警告您,在一个向公众开放的实时站点上,电子邮件错误可能会淹没您的邮箱,以防万一出现严重故障,因为对站点的每个请求都会导致发送一封不同的电子邮件。在我工作的公司中,这种情况不止一次发生过。有时很难在错误的瀑布中找到真正的原因。监控服务器日志被认为是更安全和准确的解决方案。事实证明,在错误日志上使用 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 抛出异常,这些异常将由上面定义的处理程序处理。
随时随地看视频慕课网APP
我要回答