0

以下のようなMYSQLテーブルがあり、プログラムの実行中にデータベースエラーが発生した場合はログに記録します。この部分は正常に動作します。

ここに画像の説明を入力

現在、データベース エラーが発生した場合にメールをトリガーして機能を拡張することを計画しています。だから私はできるだけ早くそれに出席することができます。

私が抱えている問題は、1 つのエラーが発生すると、1 つのメールが届くことです。100 件のエラーが発生すると、無駄なメールが 100 件届きます。私がやりたいことは、1 時間にどれだけ多くのエラーが発生しても、1 つのメールを受け取ることです。これで、テーブルにデータを挿入するときに、PHP のメール関数を使用してメールを送信するだけです。

エラーが発生したときにすぐにメールを取得したいので、1時間に1回メールを送信するcronジョブを作成できないとします。

どうすればそれを成し遂げることができますか?

4

2 に答える 2

0

私がしたことは

DB エラーが発生したということは、単純なエラーか、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;  
    } 
于 2013-04-28T05:04:25.983 に答える
0

あるいは、そのエラーが電子メールでまだ報告されているかどうか、およびエラーが発生した日時を格納するフラグを DB テーブルに設定することもできます。電子メール レポートを取得する時刻を決定します (たとえば、毎正時など)。次に、エラーをキャッチしてDBに挿入したら、報告する未解決のエラーがあるかどうか、タイムスタンプが決定した時間を過ぎているかどうかを確認します。

于 2013-04-22T11:04:14.360 に答える