Fluoresce Posted October 27, 2014 Share Posted October 27, 2014 I handle MySQL errors like this: function handle_error($err) { throw new Exception($err); } try { $con = mysql_connect("", "", "") or handle_error("mysql_connect failed! "); mysql_select_db("") or handle_error("mysql_select_db failed! "); $sql = "SELECT blah blah blah ..."; $result = mysql_query($sql, $con) or handle_error("mysql_query failed! "); } catch(exception $e) { // Log error in error_log file. trigger_error($e->getMessage() . mysql_error(), E_USER_WARNING); // Send yourself an email. error_log($e->getMessage() . "Date: " . date("l jS \of F, Y, h:i:s A") . ". File: " . $_SERVER['REQUEST_URI'], 1, "example@aol.com", "From: example@yahoo.com"); } if(isset($result)) { blah blah blah ... } The problem is, I can receive a huge number of e-mails whenever there's a connection error. How can I limit the number of e-mails that I send myself in the event that my database fails? I really haven't a clue. The only idea that I had was store the time that I sent the first e-mail in a database and then check the database before sending any other e-mails. But this obviously won't work because MySQL won't be working. Any ideas will be much appreciated. Quote Link to comment Share on other sites More sharing options...
mac_gyver Posted October 27, 2014 Share Posted October 27, 2014 you would write the information about each error to a log file. you would then scan the log file and only send an email when you want. you would normally use a cron job to trigger the scanning of the log file. 1 Quote Link to comment Share on other sites More sharing options...
Psycho Posted October 27, 2014 Share Posted October 27, 2014 Mac_gyver has provided a solid solution that you should consider. But, there is a simple 'hack' to get you a workable solution in the short run. If an error is encountered, first check the modified date of the log file. If it is more than N minutes since it was last modified, send the email. Otherwise do not send the email But, in either case you would still log the error. The result is that once you start getting errors you will get an email. But, you would not get another email from any failures unless there were no errors for the given amount of time. 1 Quote Link to comment Share on other sites More sharing options...
Fluoresce Posted October 28, 2014 Author Share Posted October 28, 2014 (edited) Thank you both. Psycho, is this kind of what you mean? It's supposed to send me an e-mail if more than 30 minutes (1,800 seconds) have elapsed since the previous e-mail. <?php $file = 'error_log'; $last_modified = filemtime($file); if(time() - $last_modified > 1800) { error_log($e->getMessage() . "Date: " . date("l jS \of F, Y, h:i:s A") . ". File: " . $_SERVER['REQUEST_URI'], 1, "example@aol.com", "From: example@yahoo.com"); } ?> The error log file (which seems to have been automatically created after my first error) doesn't seem to have an extension (such as .txt or whatever). Do I just leave the file name as "error_log"? Edited October 28, 2014 by Fluoresce Quote Link to comment Share on other sites More sharing options...
Psycho Posted October 28, 2014 Share Posted October 28, 2014 Thank you both. Psycho, is this kind of what you mean? It's supposed to send me an e-mail if more than 30 minutes (1,800 seconds) have elapsed since the previous e-mail. The error log file (which seems to have been automatically created after my first error) doesn't seem to have an extension (such as .txt or whatever). Do I just leave the file name as "error_log"? If it is working for you then, yes, that is what I mean. I can't comment on the error log file name. You appear to be using a class for your error logging. You would have to look at the code that creates that file to change it to something else - if that is what you want to do. 1 Quote Link to comment Share on other sites More sharing options...
Fluoresce Posted October 28, 2014 Author Share Posted October 28, 2014 I can't comment on the error log file name. You appear to be using a class for your error logging. You would have to look at the code that creates that file to change it to something else - if that is what you want to do. I haven't set up any classes. All I know is that there's a file in my folder called error_log. It has no extension such as .txt or .php. And when I check my php.ini file, it says: ; Log errors to specified file. error_log = error_log; I'm therefore assuming that the file called error_log was created automatically when my first error occurred. Should I create a specific file myself, such as a .txt file? Should the setup look something like this? ; Log errors to specified file. error_log = /home/user/public_html/domainfolder/error-log-file.txt; Examples given online never seem to have a clear path and they all seem to have log files with a .log extension. Quote Link to comment Share on other sites More sharing options...
Psycho Posted October 28, 2014 Share Posted October 28, 2014 Sorry, I didn't pay attention, I thought you were calling a custom method. If you want you can change the file name in the php.ini file. But, what does it matter what extension it has? Put a txt or log on there if you wish. Quote Link to comment Share on other sites More sharing options...
Fluoresce Posted October 29, 2014 Author Share Posted October 29, 2014 (edited) I'm really confused. Can anyone see why the following code logs an error but doesn't send me an e-mail when there's a connection problem? function handle_error($err) { throw new Exception($err); } try { $con = mysql_connect("", "", "") or handle_error("mysql_connect failed! "); mysql_select_db("") or handle_error("mysql_select_db failed! "); $sql = "SELECT blah blah blah ..."; $result = mysql_query($sql, $con) or handle_error("mysql_query failed! "); } catch(exception $e) { // Log error in error-log.txt. trigger_error($e->getMessage() . mysql_error(), E_USER_WARNING); // Send yourself an email if more than 30 mins (1800 seconds) have passed since previous e-mail. $last_modified = filemtime('error-log.txt'); $time_elapsed = time() - $last_modified; if($time_elapsed > 1800) { error_log($e->getMessage() . "Date: " . date("l jS \of F, Y, h:i:s A") . ". File: " . $_SERVER['REQUEST_URI'], 1, "example@aol.com", "From: example@yahoo.com"); } } The variables $last_modified and $time_elapsed are being set. I know that much. The problem seems to be the if statement. When I remove it, an e-mail is sent. Can we not have if statements in catch blocks or something? Edited October 29, 2014 by Fluoresce Quote Link to comment Share on other sites More sharing options...
mac_gyver Posted October 29, 2014 Share Posted October 29, 2014 the time check conditional statement is to send the email. after you get the $last_modified value, you will unconditionally call the error_log() statement to write the error information to the log file. if($time_elapsed > 1800) { // your email code would go here.... } the error_log() statement has a mode that accepts the filename as a parameter (though using it this way, you might as well use file_put_contents() with the append flag.) this would avoid the need to set any php.ini values. you code would have a variable holding the file name that gets used in both the filemtime() statement and the error_log() statement. Quote Link to comment Share on other sites More sharing options...
Fluoresce Posted October 29, 2014 Author Share Posted October 29, 2014 Thanks, guys.I can see the problem now. It's quite stupid of me. This is what the script's doing: Whenever there's an error, log it in error-log.txt. Check when error-log.txt was last modified (which would always be just a split second ago). Send e-mail only if $last_modified > 1,800 (which it never is). Even if I changed the order so that the e-mail is sent before the error is logged, the script is still flawed because it would not work if errors are constantly occurring. It would send the first e-mail and that's it; it won't send one every 30 minutes.The only way around it is to check not when error-log.txt was last modified but instead check when I last sent an e-mail. This is my new code—and it works! // When there's an error, log it in error file. trigger_error($e->getMessage() . mysql_error(), E_USER_WARNING); // Also, send yourself an email if more than 30 minutes have passed since previous error email. $LastEmailSent = (int)file_get_contents('last_email_sent.txt'); $TimeElapsed = time() - $LastEmailSent; if($TimeElapsed > 1800) { error_log($e->getMessage() . "Date: " . date("l jS \of F, Y, h:i:s A") . ". File: " . $_SERVER['REQUEST_URI'], 1, "example@aol.com", "From: example@yahoo.com"); file_put_contents('last_email_sent.txt', time()); } Quote Link to comment Share on other sites More sharing options...
Psycho Posted October 29, 2014 Share Posted October 29, 2014 If an error is encountered, first check the modified date of the log file. If it is more than N minutes since it was last modified, send the email. Otherwise do not send the email But, in either case you would still log the error. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.