Here is the tutorial:
Step 1. Prepare file (lib/error.handler.php) with the following code:
function fatalErrorHandler() { // Where yii_log function located require_once( __DIR__.DIRECTORY_SEPARATOR.'backend.lib.php'); //to get last error message $error = error_get_last(); // To track fatal run-time errors If ($error['type'] == E_ERROR){ // to log error note and send email alert. yii_log($error, 'error'); // temporary key for jquery to validate echo '<div style="display:none" id="fatal-error">true</div>'; } } register_shutdown_function('fatalErrorHandler');
Step 2. Include the following code in (config/web.php and config/console.php)
include_once(dirname(__FILE__).DIRECTORY_SEPARATOR.'../lib/error.handler.php');
Step 3. Prepare file (lib/backend.lib.php) with the following code:
function yii_log($message, $level, $exit = FALSE) { $message = is_array($message) ? $message['message'] : $message; $message = date('Y-m-d H:i:s', time()). ' ' . substr((string)microtime(), 1, 8) . ' - ' . $message; switch (strtolower($level)) { case 'error': Yii::error($message); break; case 'warning': Yii::warning($message); break; case 'info': Yii::info($message); break; case 'trace': default: Yii::trace($message); break; } // Yii::log($message, $level); Yii::getLogger()->flush(); // also alert via email send_email_alert($message); if($exit) { exit(); } } function send_email_alert($message) { $from = get_no_reply_email(); $sendTo = get_alert_email(); $app_name = Yii::$app->name; $headers="From: {$from}\r\nReply-To: {$from}"; mail($sendTo, $app_name . ' Alert', $message, $headers); }
Step 4. Prepare Ajax file (check_error.js) checking
$(document).ready(function() { if ($("#fatal-error").length) { //$("upload-csv-form").before('File: '+decodeURIComponent(getCookie('csvfile')).match(/"(.+)"/)[1]+' import was failed!'); var filename = decodeURIComponent(getCookie('csvfile')).match(/"(.+)"/)[1]; var postData = { csvfile: filename}; if (typeof yii.getCsrfToken != 'undefined' && yii.getCsrfToken() != '' ) { postData[yii.getCsrfParam()] = yii.getCsrfToken(); } $.ajax({ url: '/member/updatestatus', data: postData, type: 'POST', dataType: 'jason', success: function(){ } }); $("pre").replaceWith('Importing of '+filename+' did not complete successfully because of a server side error (no memory, performance issues or connection issues).'); } });
function getCookie(cname) { var name = cname + "="; var ca = document.cookie.split(';'); for(var i=0; i<ca.length; i++) { var c = ca[i]; while (c.charAt(0)==' ') c = c.substring(1); if (c.indexOf(name) == 0) return c.substring(name.length,c.length); }
Step 5. Register js file in view file
$this->registerJsFile($this->getAssetManager()->getPublishedUrl('@app/themes/dashboard').'/js/check_error.js', ['position' => $this::POS_END]);
No comments:
Post a Comment