rollbar_codeigniter并非官方包,应直接使用官方rollbar/rollbar-php集成;通过register_shutdown_function、set_exception_handler等机制捕获各类错误,并手动上报数据库异常以确保全覆盖。

Rollbar_CodeIgniter 并不是一个官方维护或广泛采用的独立包。目前 Rollbar 官方 PHP SDK(rollbar/rollbar-php)本身已原生支持 CodeIgniter 3 和 CodeIgniter 4,无需额外封装层。很多开发者误以为存在专用的 Rollbar_CodeIgniter 包,结果在 Composer 中搜不到、安装失败,或引入了过时/非官方的 fork。
直接使用官方 rollbar/rollbar-php 集成到 CodeIgniter 4
CodeIgniter 4 的异常处理机制基于 PSR-15 中间件和 CodeIgniter\Exceptions\Logger,但默认不捕获所有未处理异常或错误(如致命错误、PDO 异常、超时等)。官方 Rollbar SDK 可以补全这一环:
- 使用
register_shutdown_function()捕获致命错误(E_ERROR、E_PARSE等) - 通过
set_exception_handler()拦截未捕获异常 - 通过
set_error_handler()转换 PHP 错误为异常(可选)
你不需要重写框架异常类,也不必修改 system/Exceptions/ 下的任何文件。
- 在
app/Config/Boot/production.php或app/Config/Boot/common.php中初始化 SDK(确保仅在需要的环境中启用) - 调用
Rollbar::init()前,先检查ROLLBAR_TOKEN环境变量是否设置,避免开发环境误发数据 - 将
error_reporting(E_ALL)保持开启,否则部分警告不会被 Rollbar 捕获 - 不要同时启用 CI4 自带的
CI_DEBUG和 Rollbar 的report_php_errors: true,否则重复上报
示例初始化代码(放在 app/Config/Boot/common.php 底部):
if (env('ROLLBAR_TOKEN')) {
require_once SYSTEMPATH . 'ThirdParty/rollbar/autoload.php';
\Rollbar\Rollbar::init([
'access_token' => env('ROLLBAR_TOKEN'),
'environment' => ENVIRONMENT,
'report_php_errors' => true,
'capture_error_stacktraces' => true,
'include_error_code_context' => true,
]);
}
如何让 CodeIgniter 数据库错误(如 MySQL 连接失败、SQL 语法错误)也进 Rollbar
CI4 的数据库层(CodeIgniter\Database)默认把底层 PDO 异常包装为 DatabaseException,但这类异常不会自动触发 set_exception_handler() —— 因为它们通常在模型或控制器中被 try/catch 吞掉,或由 CI 自身的错误页兜底。
要确保这些错误也被 Rollbar 记录:
- 在关键数据库操作处手动调用
\Rollbar\Rollbar::error(),例如:try { $this->db->table('users')->insert($data); } catch (\CodeIgniter\Database\Exceptions\DatabaseException $e) { \Rollbar\Rollbar::error('DB insert failed', $e); throw $e; } - 或者,在
app/Config/Database.php中启用'DBDebug' => true(仅限开发),配合 Rollbar 的report_php_errors: true,让 SQL 错误先转成 PHPE_USER_WARNING再被捕获 - 不要依赖
system/Database/DB_driver.php行号定位问题:Rollbar 自动采集完整堆栈,包括Query、Bindings和Connection Info(需开启include_error_code_context)
为什么 Rollbar_CodeIgniter 类似包容易出问题
搜索到的所谓 Rollbar_CodeIgniter 多数是 2016–2019 年间的社区 DIY 封装,普遍存在:
- 硬编码 CI3 的
Exceptions类路径,与 CI4 的命名空间(CodeIgniter\Exceptions\)完全不兼容 - 把
Rollbar::init()放在core/Common.php,导致每次 HTTP 请求都重复初始化(引发 Warning:“Rollbar already initialized”) - 未处理 CLI 环境(如
spark migrate),造成命令行任务卡死或 token 泄露 - 忽略
ignore配置项,把404、403等 HTTP 异常也上报,污染错误看板
真正需要关注的,是 Rollbar 初始化时机、异常逃逸路径、以及数据库错误是否被显式抛出 —— 这些比找一个名字带 CodeIgniter 的包重要得多。
Rollbar 不会自动知道你哪段 SQL 出了错,除非它真的变成异常或错误;而 CodeIgniter 的静默失败倾向,恰恰是它最容易漏报的地方。











