lilmer Posted July 7, 2015 Share Posted July 7, 2015 The problem is that I've already implemented procedures that has no try-and-catch exceptions. Is there any procedure or functions that I can catch all PHP errors occurs in every page Globally? Link to comment https://forums.phpfreaks.com/topic/297206-how-to-catch-all-php-errors-in-codeigniter-framework/ Share on other sites More sharing options...
requinix Posted July 7, 2015 Share Posted July 7, 2015 set_error_handler Not quite the same thing but it will let you catch most errors. Not the very fatal ones, though. Link to comment https://forums.phpfreaks.com/topic/297206-how-to-catch-all-php-errors-in-codeigniter-framework/#findComment-1515750 Share on other sites More sharing options...
sKunKbad Posted July 7, 2015 Share Posted July 7, 2015 I've actually been using set_error_handler in a pre_system hook with CodeIgniter. If on development machine I just see the errors, however if on production the errors are logged to a file, then once every 15 minutes the file is emailed to me. Don't be tempted to email yourself with each error as it happens. I learned the hard way that if PHP loops through an array where a notice is generated it will send you as many emails as notices. I got 4000 emails one day! <?php function my_error_handler( $e_number, $e_message, $e_file, $e_line, $e_vars ) { // Debugging allows dev to log errors like production $debug = FALSE; // The amount of E_NOTICE + E_STRICT before we die() $error_limit = 25; // The number of errors counted on this request static $error_count = 1; // Set the text of type of error displayed switch( $e_number ) { case E_USER_ERROR: $error_type = 'E_USER_ERROR'; break; case E_USER_WARNING: $error_type = 'E_USER_WARNING'; break; case E_USER_NOTICE: $error_type = 'E_USER_NOTICE'; break; case E_WARNING: $error_type = 'E_WARNING'; break; case E_NOTICE: $error_type = 'E_NOTICE'; break; case E_STRICT: $error_type = 'E_STRICT'; break; default: $error_type = 'UNKNOWN ERROR TYPE'; break; } // Output for development or testing environments (unless debug === TRUE) if( ENVIRONMENT != 'production' && $debug !== TRUE ) { echo '<hr />PHP ' . $error_type . ' #' . $e_number . ' - Date/Time: ' . date('n/j/Y H:i:s') . PHP_EOL . '<br />File: <b>' . $e_file . '</b>' . PHP_EOL . '<br />Line: <b>' . $e_line . '</b>' . PHP_EOL . '<br /><b>' . $e_message . '</b><hr />' . PHP_EOL; } // Log file for production environment else { // MAIN MESSAGE $message = '#---' . PHP_EOL . 'PHP ' . $error_type . ' #' . $e_number . ' - Date/Time: ' . date('n/j/Y H:i:s') . PHP_EOL . 'File: ' . $e_file . PHP_EOL . 'Line: ' . $e_line . PHP_EOL . 'Message: ' . $e_message . PHP_EOL; // POST VARS if( isset( $_POST ) && ! empty( $_POST ) ) { $message .= 'POST vars:' . PHP_EOL; foreach( $_POST as $k => $v ) { $message .= '\t' . $k . ' = ' . $v . PHP_EOL; } } // REQUEST HEADERS if( $request_headers = apache_request_headers() ) { $message .= 'Request headers:' . PHP_EOL; foreach( $request_headers as $k => $v ) { $message .= '\t' . $k . ' = ' . $v . PHP_EOL; } } // REQUEST URI $message .= 'Request URI: ' . $_SERVER['REQUEST_URI'] . PHP_EOL; // ERROR COUNT $message .= 'Error Count: ' . $error_count . PHP_EOL; $message .= '#--' . PHP_EOL; // Second param (3) says to store error in specified log file error_log($message, 3, FCPATH . '/application/logs/php_errors/php_errors.log' ); // If not an E_NOTICE or E_STRICT, die() if( $e_number != E_NOTICE && $e_number < E_STRICT ) { die( '<br /><br /><span style="color:red;">A system error occurred. We apologize for the inconvenience.</span>'); } // If too many E_NOTICE or E_STRICT, die() $error_count++; if( $error_count > $error_limit ) { die( '<br /><br /><span style="color:red;">A system error occurred. We apologize for the inconvenience.</span><br /><span style="font-size:50%;">E_NOTICE + E_STRICT > ' . $error_limit . '</span>'); } } // Don't execute PHP internal error handler return TRUE; } function my_error_handling() { set_error_handler('my_error_handler', E_ALL); } Link to comment https://forums.phpfreaks.com/topic/297206-how-to-catch-all-php-errors-in-codeigniter-framework/#findComment-1515784 Share on other sites More sharing options...
requinix Posted July 7, 2015 Share Posted July 7, 2015 Don't be tempted to email yourself with each error as it happens. I learned the hard way that if PHP loops through an array where a notice is generated it will send you as many emails as notices. I got 4000 emails one day! ignore_repeated_errors can help with that. Another trick is to use Linux's logrotate: it can keep individual error files small by rotating them: error.log becomes error.log.1 becomes error.log.1.gz and so on. You can have it email you the error file at the same time. Link to comment https://forums.phpfreaks.com/topic/297206-how-to-catch-all-php-errors-in-codeigniter-framework/#findComment-1515791 Share on other sites More sharing options...
scootstah Posted July 7, 2015 Share Posted July 7, 2015 set_error_handler Not quite the same thing but it will let you catch most errors. Not the very fatal ones, though. You can use register_shutdown_function to capture (most) fatal errors. Link to comment https://forums.phpfreaks.com/topic/297206-how-to-catch-all-php-errors-in-codeigniter-framework/#findComment-1515795 Share on other sites More sharing options...
lilmer Posted July 8, 2015 Author Share Posted July 8, 2015 Thank you for your response, I set it using codeigniter hooks, using PHP set_error_handler, register_shutdown_function for fatal erros. Link to comment https://forums.phpfreaks.com/topic/297206-how-to-catch-all-php-errors-in-codeigniter-framework/#findComment-1515807 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.