CodeIgniter 无法直接使用 Airbrake 官方 PHP SDK,因其依赖 PSR-15/PSR-3 及统一异常处理器,而 CI3/CI4 均不满足;必须通过重写 log_message 错误日志驱动,手动调用 notify() 上报。

CodeIgniter 本身不内置 Airbrake 支持,必须手动集成;直接装官方 airbrake gem 或 npm 包会失败,因为 CI 是纯 PHP 框架,没有自动中间件钩子和异常捕获机制。
为什么不能直接用 Airbrake 官方 PHP SDK?
Airbrake 官方 PHP SDK(airbrake/phpbrake)默认依赖 PSR-15 中间件、PSR-3 日志器,并假设应用有统一的异常处理器(如 Laravel 的 App\Exceptions\Handler)。CodeIgniter 3/4 均不满足这些前提:
- CI3 没有标准异常处理入口,
set_exception_handler()被框架自身覆盖,且错误常被@抑制(比如mysql_driver.php) - CI4 虽支持
Throwable捕获,但默认未注册全局 handler,也无 request context 自动注入 - 官方 SDK 的
Notifier实例需要手动触发notify(),不会自动上报未捕获异常
正确集成路径:用 log_message() 触发 Airbrake 上报
CodeIgniter 的日志系统是唯一可控、稳定、贯穿全生命周期的出口。Airbrake 必须退回到「日志驱动上报」模式,而非「异常拦截模式」:
- 在
application/config/config.php中确保$config['log_threshold'] >= 1(否则log_message('error', ...)直接丢弃) - 创建自定义日志类(如
application/libraries/Airbrake_log.php),重写write_log()方法,在写入文件前检查级别为'error'并调用 Airbrakenotify() - 初始化 Airbrake
Notifier时,禁用自动异常捕获:new Notifier($config, false),避免与 CI 冲突 - 关键点:所有你主动记录的错误(如数据库失败、API 调用超时)必须用
log_message('error', $msg),不能只靠原生 PHP 错误(Notice/Warning不走log_message)
常见漏报场景与修复
以下情况看似报错,但 Airbrake 不会收到任何数据:
-
404错误:CI 自动调用show_404(),但只打log_message('error', 'Unable to load the requested file')—— 若log_threshold为 0,这行就消失了 - 白屏(500)但日志为空:常见于
mysql_set_charset等函数被@抑制,或display_errors = Off+log_errors = Off双关闭,此时需先打开 PHP 错误日志定位根本原因 - SQL 查询失败没进 Airbrake:CI 的
query()失败默认只返回FALSE,不自动记日志;必须显式加判断:if ($this->db->query($sql) === FALSE) { log_message('error', 'Query failed: ' . $this->db->error()['message']); }
CI4 中可选的轻量替代方案
如果你用的是 CodeIgniter 4,可绕过完整 Airbrake SDK,改用其底层 HTTP 接口直接上报:
- 用
curl_init()向https://api.airbrake.io/api/v4/projects/{project_id}/noticesPOST JSON - 必需字段:
errors(含type、message)、context(含environment、userAgent)、params(可选请求参数) - 优势:不引入额外依赖,不干扰 CI4 的
Events::on('pre_system')或Exceptions类 - 风险:丢失堆栈追踪(除非手动
debug_backtrace()提取并格式化)
真正卡住的不是 Airbrake 配置,而是你是否把所有「业务层面的失败」都转成了 log_message('error', ...) —— 这一步漏掉,再好的监控服务也收不到信号。


















