codeigniter 不原生支持 honeybadger,需手动集成并绕过其默认错误处理机制;关键是在 index.php 初始化 sdk,在 my_exceptions.php 中重写 exception() 方法显式通知,并在响应结束前调用 flush() 防止丢包。

CodeIgniter 本身不原生支持 Honeybadger,也没有官方维护的 Honeybadger_CodeIgniter 扩展包。直接在 CI 中“使用 Honeybadger”必须手动集成,且需绕过框架默认错误捕获机制——否则你只会看到空白页或被吞掉的异常。
为什么 CI 默认不触发 Honeybadger 报告
CodeIgniter(尤其是 CI3)在 index.php 中调用 error_reporting(0) 或受限级别,并用自定义错误处理器(set_error_handler、set_exception_handler)接管所有错误,导致未被捕获的异常根本不会冒泡到 PHP 全局层,Honeybadger 的自动 hook 也就完全失效。
常见现象包括:
- 启用数据库库后整个页面空白,
php_error.log和application/logs/都无记录 - 手动
throw new Exception('test')不上报,Honeybadger.notify()却能成功 - 配置了
log_threshold = 4,但 Honeybadger 控制台始终零事件
CI3 中手动集成 Honeybadger 的关键步骤
以 CI3 为例(CI4 可类推,但需适配 PSR-4 自动加载),核心是「绕过 CI 错误拦截 + 在异常逃逸前主动捕获」:
- 在
index.php顶部(define('ENVIRONMENT', ...)后、加载框架前)插入:require_once FCPATH . 'vendor/autoload.php'; Honeybadger\Honeybadger::configure([ 'api_key' => 'your-api-key-here', 'environment' => ENVIRONMENT, 'report_data' => true ]); - 在
application/core/MY_Exceptions.php中重写exception()方法,显式调用Honeybadger::notify():public function exception($exception) { \Honeybadger\Honeybadger::notify($exception); parent::exception($exception); } - 确保
composer require honeybadger/honeybadger已执行,且vendor/在FCPATH下可访问
CI 中调用 Honeybadger 的典型场景与陷阱
不要依赖自动捕获——CI 的生命周期和错误处理链太深,自动 hook 极易失效。可靠做法始终是「显式通知 + 条件兜底」:
- 控制器中捕获业务异常时:
try { ... } catch (\Exception $e) { \Honeybadger\Honeybadger::notify($e); throw $e; } - 数据库连接失败等底层错误:需在
MY_DB_driver子类的connect()里加notify(),因为 CI 的DB_driver会静默吞掉 PDO 异常 - 避免在
__construct()中直接调用Honeybadger::notify()—— 此时 autoloader 可能未就绪,报Class not found - 生产环境务必关闭
display_errors,否则敏感信息可能随 HTML 泄露;Honeybadger 的params_filters配置项必须设好,如['password', 'api_key']
最易被忽略的一点:CI 的 output 类会在最后阶段强制清空输出缓冲并发送 headers,若此时 Honeybadger 的异步 HTTP 请求尚未完成(尤其在慢网络或高延迟 DNS 下),报告会静默丢弃。解决方案是调用 \Honeybadger\Honeybadger::flush() 在响应结束前强制发送。











