Raven_CodeIgniter已停止维护且不兼容PHP 8+,因其依赖归档的旧版Raven-PHP库,导致Class 'Raven_Client' not found、方法签名冲突、HTTP上报被拒等失败;应改用sentry/sdk官方SDK直连。

Raven_CodeIgniter 已停止维护,直接集成 Sentry 官方 SDK(sentry/sdk)才是当前可靠方案。 它不兼容 PHP 8+,且依赖的旧版 Raven-PHP 库早已归档,强行用会卡在 autoloader、SSL 验证或事件钩子上。
为什么 Raven_CodeIgniter 现在基本跑不起来
常见失败现象包括:Class 'Raven_Client' not found、Call to undefined method CI_Exceptions::show_exception()、或上报后 Sentry 后台收不到任何 event。
- 底层
Raven-PHP不支持 PSR-4,与 CodeIgniter 3.1.11+ 的Composer自动加载逻辑冲突 - 它 hook 的是
CI_Exceptions::show_exception(),但 CI 3.1.9+ 改写了该方法签名,导致 fatal error - 默认使用 HTTP(非 HTTPS)上报,新版 Sentry 服务器强制拒绝,报错
Connection refused或SSL certificate problem
CodeIgniter 3 正确接入 Sentry 的步骤
以 CI 3.1.13 + PHP 7.4/8.0 为例,跳过所有第三方封装,直连官方 SDK:
- 执行
composer require sentry/sentry(不要装raven/raven) - 在
application/config/autoload.php中确保'sentry'已加入$autoload['libraries'] - 新建
application/libraries/Sentry.php,内容为:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
use Sentry\State\Hub;
use Sentry\ClientBuilder;
use Sentry\Integration\IgnoreErrorsIntegration;
class Sentry {
protected $client;
public function __construct() {
$options = [
'dsn' => 'https://xxx@o123456.ingest.sentry.io/123456',
'environment' => ENVIRONMENT,
'integrations' => [new IgnoreErrorsIntegration(['E_WARNING'])],
];
$this->client = ClientBuilder::create($options)->getClient();
Hub::setCurrent(new Hub($this->client));
}
}
- 在
application/core/MY_Exceptions.php中重写log_exception():
<?php
class MY_Exceptions extends CI_Exceptions {
public function log_exception($severity, $message, $filepath, $line) {
parent::log_exception($severity, $message, $filepath, $line);
if (class_exists('Sentry')) {
\Sentry\captureException(new ErrorException($message, $severity, 0, $filepath, $line));
}
}
}
关键参数和容易漏掉的点
DSN 必须带协议(https://),不能只写域名;环境名建议用 ENVIRONMENT 常量,避免硬编码;PHP 8 下需确认 sentry/sdk 版本 ≥ 3.5.0。
-
ignore_errors集成要显式传入,否则E_NOTICE类警告也会触发上报,刷爆配额 - CI 的
show_404()不走log_exception(),如需捕获 404,得在MY_Router或_remap()中手动调用\Sentry\captureMessage('404: '.$this->uri->uri_string()) - 数据库连接失败等底层错误,可能在 CI 加载完成前就崩了,这类需要在
index.php最顶部加set_error_handler()+\Sentry\init()
真正起作用的从来不是“插件有没有装上”,而是错误是否真的流经了 Sentry 的 capture 函数——中间任何一个 return、exit 或未 catch 的致命错误,都会截断上报链路。


















