CodeIgniter需手动集成Rollbar-PHP v3.x(PHP 8.0+)实现远程错误上报,CI3在MY_Exceptions中捕获异常,CI4在Exceptions.php注册handler,数据库错误须主动检查$this->db->error()并手动上报。

CodeIgniter 本身不内置远程错误上报能力,Rollbar-PHP 是可行方案,但必须手动集成——官方没有 rollbar-codeigniter 包,也没有自动钩子。
确认 Rollbar SDK 版本兼容性
当前(2026 年)稳定可用的是 rollbar/rollbar-php v3.x(PHP 8.0+),v2.x 已停止维护。CodeIgniter 3 和 4 都能用,但初始化时机和异常捕获点不同:
- CI3:需在
system/core/Exceptions.php中重写show_error()和show_exception(),或在application/core/MY_Exceptions.php中扩展 - CI4:推荐在
app/Config/Exceptions.php的$handlers中注册自定义 handler,或利用Events::on('spark.shut.down')捕获未处理异常 - 注意:v3 SDK 默认启用异步发送(cURL + fork),若服务器禁用
pcntl_fork,需显式设'handler' => 'sync'
手动初始化 Rollbar 并捕获全局异常
不要依赖 CI 自带的 error logging 配置(如 $config['log_threshold']),Rollbar 需独立配置并主动触发。典型做法是:
- 在
application/config/autoload.php(CI3)或app/Config/Autoload.php(CI4)中加载rollbar类(通过 Composer 自动加载) - 在
index.php底部或app/Config/Boot/production.php中调用Rollbar::init(),传入access_token和环境标识 - 对 CI3,在
MY_Exceptions::show_exception()里加Rollbar::error($exception);对 CI4,在app/Config/Exceptions.php的handle()方法中调用Rollbar::error()或Rollbar::critical() - 数据库查询错误不会自动上报,需在模型或查询后手动检查:
if ($this->db->error()['code']) { Rollbar::warning('DB error', $this->db->error()); }
避免重复上报和日志污染
CI 默认会把错误写入 logs/,Rollbar 再发一遍,容易造成冗余。关键控制点:
- 关闭 CI 的 PHP 错误日志:确保
$config['log_threshold'] = 0(CI3)或Config\Logger::$threshold = 0(CI4),否则E_ERROR级别仍会落盘 - Rollbar 初始化时禁用本地 fallback 日志:
'local_vars_dump' => false,否则敏感变量可能被写入临时文件 - MySQL 错误不会进 Rollbar 自动捕获范围,
mysqli或PDO抛出的异常才触发——CI 的DB_driver层做了静默吞错(比如返回空数组而非抛异常),必须显式判断$this->db->error() - 不要在
register_shutdown_function里重复调用Rollbar::error(),CI 自身已用该机制做兜底,双注册会导致同个 fatal error 上报两次
最易忽略的是数据库层——system/database/DB_driver.php 中的错误被封装成数组返回,从不抛出 Exception,所以 Rollbar 根本看不到。想追踪 MySQL 错误,唯一可靠方式是在每次查询后主动检查 $this->db->error() 并手动上报。


















