如何在CakePHP2中全站检查致命错误并发送告警邮件
在CakePHP 2中捕获全站致命错误并发送告警邮件
完全可行!CakePHP 2本身提供了灵活的错误和异常处理机制,我们可以通过自定义处理逻辑轻松实现这个需求。下面是具体的实现步骤:
1. 创建自定义错误处理类
首先在app/Lib/Error目录下新建一个自定义错误处理类,比如AppErrorHandler.php,用来接管系统的错误捕获逻辑:
App::uses('ErrorHandler', 'Error'); class AppErrorHandler extends ErrorHandler { // 捕获致命错误(比如E_ERROR、E_PARSE这类会终止程序运行的错误) public static function handleFatalError($code, $description, $file, $line) { // 先保留系统默认的日志记录(可选,方便后续排查) parent::handleFatalError($code, $description, $file, $line); // 组装告警邮件内容 $subject = '【站点紧急告警】发生致命错误'; $message = "站点出现致命错误,详情如下:\n"; $message .= "错误代码:{$code}\n"; $message .= "错误描述:{$description}\n"; $message .= "错误文件:{$file}\n"; $message .= "错误行号:{$line}\n"; $message .= "发生时间:" . date('Y-m-d H:i:s') . "\n"; // 使用CakePHP的Email组件发送邮件 App::uses('CakeEmail', 'Network/Email'); $email = new CakeEmail(); $email->from(array('system-alert@your-site.com' => '站点错误监控')) ->to('site-owner@your-site.com') ->subject($subject) ->send($message); } // 可选:捕获非致命的严重错误(比如E_WARNING、E_CORE_WARNING) public static function handleError($code, $description, $file = null, $line = null, $context = null) { parent::handleError($code, $description, $file, $line, $context); // 只针对严重级别错误发送邮件,避免邮件轰炸 $criticalErrors = array(E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR); if (in_array($code, $criticalErrors)) { // 可复用上面的邮件发送逻辑 } } }
2. 配置应用使用自定义错误处理
打开app/Config/core.php,替换默认的错误处理注册逻辑:
// 替换原来的ErrorHandler::register() App::uses('AppErrorHandler', 'Lib/Error'); AppErrorHandler::register();
同时注意生产环境下要把调试模式关闭:
Configure::write('debug', 0);
调试模式开启时,系统会优先显示错误页面,不会触发自定义的邮件告警逻辑。
3. 关键注意事项
- 邮件配置校验:确保
app/Config/email.php中已经正确配置了SMTP服务器、端口、账号等参数,否则邮件无法正常发送。 - 避免邮件轰炸:如果站点短时间内频繁出现相同错误,建议添加去重逻辑,比如记录最近1小时内发送过的错误,重复错误不再发送。
- 异常补充处理:除了致命错误,你还可以自定义
AppExceptionHandler继承ExceptionHandler,用来捕获未被处理的异常,实现同样的告警逻辑。 - 日志备份:即使发送了邮件,也不要关闭系统默认的错误日志,
app/tmp/logs/error.log会保留完整的错误记录,方便后续深入排查。
完成以上配置后,只要站点发生致命错误,系统就会自动向指定邮箱发送包含错误文件和行号的告警邮件了。
内容的提问来源于stack exchange,提问作者Parveen Chauhan
相关产品推荐
相关产品推荐

