当前位置: 首页 > 知识库问答 >
问题:

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

卢嘉誉
2023-03-14

我怎样才能得到所有的PHP异常,包括由mysqli生成的异常和通过电子邮件发送给我的正常PHP异常?

问题环境

我在ISP上使用共享服务器,无法访问任何管理员类型的PHP配置文件。在服务器上,我只有大约一百行PHP对MySQL数据库执行查询,如果返回任何行,它将执行一些SQL更新命令。这是作为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'); 

最小,可复制的例子

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

<?php

function the_error_handler($number, $message, $file, $line, $vars) //putting $vars in shows all the variables the server knows about(inluding passwords)
{
    $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');

echo $NonExsitentVariable;  //<--deliberate error

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

$servername = "65.78.165.199";
$username = "test_user"; //execute, select, update and create temp files rights
$password = "U7frgh%^yT";
$dbname = "devlopment_db";

$the_sql = "SELECT  * FROM non_existent_table;";   //<-- another deliberate error
$conn    = mysqli_connect($servername, $username, $password, $dbname); // Create connection
$result  = mysqli_query($conn, $the_sql); //run the query and get a pointer to the result
$rows    = mysqli_fetch_all($result, MYSQLI_ASSOC); //convert to an associative array of rows to send back 
?>

结果

结果是不存在的变量错误通过电子邮件发送给我,但mysqli错误只是被放入服务器上的错误日志中,而不是通过电子邮件发送。

如何通过电子邮件将这两个或所有错误发送给我?(很明显,真正的代码有点复杂,如果在这里完整发布,会混淆问题,但如果我能理解如何处理这个简单的示例,原则是一样的)

背景资料

在退休前的35年里,我一直在计算机编程和讲课,但从来没有必要(或希望!)用PHP编程。这是我的第一个脚本,可能是我的最后一个脚本,因此如果您能够提供帮助,请合理明确地说明我需要做什么,因为我对PHP语法或编程环境不太熟悉)

我看过的一些非常有趣的帖子

使用PHP和mysqli,是否可以在一个位置捕获所有PHP脚本中的所有mysqli错误?

处理电子邮件异常的好方法

PHP异常错误消息

PHP异常内抓:如何处理?

共有1个答案

解晟
2023-03-14

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

监控服务器日志被认为是更安全和准确的解决方案。对我来说,在错误日志上使用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抛出异常,这些异常将由上面定义的处理程序处理。

 类似资料:
  • MyCode: 我的错误: 线程“main”java.lang.RuntimeException:javax.mail.messagingException: 未知SMTP主机:SMTP.gmail.com; 嵌套异常为: java.net.unknownHostException:SMTP.gmail.com 位于mail.sendmailtls.main(Sendmailtls.java:56

  • 当我使用gmail smtp获得异常时,我遇到了一个问题。 1) 允许不太安全的应用:打开 2)尝试过的端口587, 465, 25(相同的例外) 3)尝试禁用SSL(相同的例外) 4) smtp的telnet。gmail。用于端口465、587的com,以及从用于smtp的电子邮件地址直接发送 思想? 使用端口587的异常: 使用端口465的异常: 更新:更改到获取新异常: 感谢任何帮助!

  • 第一次使用java邮件。我正在遵循本教程,但我已经无法发送基本消息,并且我收到了一个非常奇怪的错误: 奇怪的是,我的代码中没有使用IMAP: 错误发生在最后一行(发送)。我知道smtp服务器正常工作。 有什么建议吗?为什么会发生这种情况?我该如何解决? 编辑:显然,地址/主机在这里发生了更改,我使用的是在实际代码中工作的真实地址/主机。

  • 我是Java初学者,我想用Java发送电子邮件。为此,我使用这段代码发送电子邮件,但这段代码引发了一个异常。我已经验证了我的用户名和密码,它们绝对没有问题,所以请告诉我是否有其他方法用Java发送电子邮件? 这是异常的堆栈跟踪: 这是我的代码

  • 通过Java发送邮件时获取异常 例外情况是: 以下是Java代码: 我在运输方面出了差错。发送(msg);我在这里使用的JAR::smtp 1.6.0、Javax Mail 1.4.7、邮件激活

  • 致命异常:Android.app.RemoteServiceException从包xxx发布的错误通知:无法展开以下内容的RemoteViews:StatusBarNotification(PKG=xxx User=UserHandle{0}ID=1 Tag=null Score=0:notification(PRI=0 ContentView=xxx/0x1090065震动=null Sound