如何针对多个错误触发一封邮件

时间:2013-04-22 10:51:18

标签: php mysql email error-handling

我有一个MYSQL表,如果在程序执行期间发生了任何错误,它会记录数据库错误。这部分工作正常。

enter image description here

现在,我计划通过在发生数据库错误时触发邮件来扩展功能。所以我可以尽快参加。

我遇到的问题是如果发生一个错误,我会收到一封邮件。如果发生100个错误,我会收到100封无用的邮件。我想做的是尽管在一小时内发生了多少错误,但仍然可以收到一封邮件。现在我只是使用PHP邮件功能在我向表中插入数据时发送邮件。

鉴于我不能写一个每小时发送一次邮件的cron作业,因为我想在发生错误时立即收到邮件。

我怎样才能完成它?

2 个答案:

答案 0 :(得分:0)

您也可以在数据库表中有一个标志,用于存储是否已通过电子邮件报告该错误以及发生错误的日​​期时间。决定您希望收到电子邮件报告的时间,例如每小时一小时。然后,当您发现错误并将其插入数据库时​​,请检查是否有任何未完成的错误要报告,以及他们的时间戳是否超过您决定的时间,如果是,请将它们全部分组并通过电子邮件发送报告。

答案 1 :(得分:0)

我做的是

发生数据库错误意味着它可能是一个简单的错误或致命的错误,如MySQL服务器已经消失。那时尝试访问数据库将毫无用处。

  • 动态创建错误日志文件。
  • 如果文件大小为0字节/不存在,我会触发一封电子邮件,然后将错误记录到新创建的文件中。
  • 如果发生更多错误,请记录下来。
  • 在出现错误后,我清除/删除文件。
  • 下次发生错误我再次收到邮件。

我知道它只有删除文件的手动工作。但是你通过使用这种方法解决了很多问题。

     /**
     * THIS FUNCTION LOGS THE ERRORS TO THE FILE
     * @param  string  $error_details Details of The Error
     * @return bool            
     */
    function saveErrorToFile($error_details){

        $file_path = JPATH_COMPONENT_ADMINISTRATOR.DS.'helpers'.DS.'error_log.txt';
        if(!JFile::exists($file_path ))
        {
            //create the file and write the error
            JFile::write($file_path,$error_details);

            //send the mail with the error
            $mail =& JFactory::getMailer();
            $mail->setSender(array('support@abc.com', 'support'));
            $mail->setSubject('DATABASE ERROR');
            $mail->setBody($error_details);
            $mail->IsHTML(true);
            $mail->addRecipient('dasun@abc.com');
            $mail->Send();

        }
        else
        {
            //read the existing content of the file and append with the new error
            $file_content = JFile::read($file_path);
            $file_content = $file_content."\n\n".$error_details;
            JFile::write($file_path,$file_content);
        }

        return true;  
    }