因为codeigniter错误处理链路在框架加载前启动,sentry_codeigniter必须在index.php中、require_once basepath.'core/codeigniter.php'之前初始化,以确保在ci覆盖error_reporting()和set_error_handler()前完成注册,捕获parse error、fatal error等早期错误。

为什么 Sentry_CodeIgniter 的 init() 必须在 index.php 里调用
因为 CodeIgniter 的错误处理链路在框架加载前就已启动,Sentry_CodeIgniter 需要在 error_reporting() 和 set_error_handler() 被 CI 自身覆盖前完成注册。如果你把它塞进某个控制器或 MY_Controller,绝大多数 PHP 错误(比如 Parse Error、Fatal Error)根本不会触发——Sentry 还没就位,进程已经退出了。
实操建议:
- 打开
index.php,在require_once BASEPATH.'core/CodeIgniter.php';之前插入初始化代码 - 确保
require_once APPPATH.'third_party/sentry/Sentry_CodeIgniter.php';已正确引入(路径需与你实际存放位置一致) - 调用
Sentry_CodeIgniter::init('your_dsn_here');,DSN 必须是完整字符串,含协议、public key、project ID 和 host - 不要依赖 CI 的 autoloader 加载这个库——它不走
autoload.php,也不支持 Composer 自动发现
捕获 404 和 500 页面但不上报的常见原因
Sentry_CodeIgniter 默认只捕获 PHP 级别的异常和错误(E_ERROR、E_WARNING 等),CI 的 404 是通过 show_404() 输出 HTML 并 exit(),不抛异常;500 页面若由 CI 自己渲染(比如控制器构造函数里出错但未开启 display_errors),也未必触发 PHP 错误处理器。
实操建议:
- 在
application/errors/error_404.php末尾手动加Sentry_CodeIgniter::captureMessage('404 Not Found: '.$this->router->uri->uri_string(), 'info'); - 在
application/core/MY_Exceptions.php中重写show_500(),并在其中调用Sentry_CodeIgniter::captureException(new Exception('Internal Server Error')); - 确认
error_reporting(E_ALL)在index.php中已启用,否则低级别错误(如E_NOTICE)会被忽略
Sentry_CodeIgniter::captureException() 传什么对象才有效
它只接受 Exception 或其子类实例,传字符串、数组或 Error(PHP 7+)会静默失败——没有报错,但 Sentry 后台收不到事件。
实操建议:
- 在 try/catch 块中,直接传
$e:Sentry_CodeIgniter::captureException($e); - 不要传
new Exception($e->getMessage()),这会丢失原始堆栈和上下文 - 若需补充信息,用
Sentry_CodeIgniter::addBreadcrumb()或Sentry_CodeIgniter::setExtraData(),例如:Sentry_CodeIgniter::setExtraData(['user_id' => $this->session->userdata('id')]); - 注意:CI 2.x 的
Exceptions类本身继承自Exception,可直接传;CI 3.x 使用CI_Exceptions,但最终抛出的仍是标准Exception实例
本地开发时 Sentry 不上报却无提示的排查点
最常被忽略的是 DSN 格式错误或网络限制。Sentry SDK 默认静默丢弃失败请求,不会抛异常、不打印日志、也不触发 CI 的日志系统。
实操建议:
- 检查 DSN 是否含多余空格或换行,用
trim()包裹:Sentry_CodeIgniter::init(trim($dsn)); - 临时在
Sentry_CodeIgniter.php的send()方法里加file_put_contents('/tmp/sentry_debug.log', print_r($payload, true), FILE_APPEND);确认数据是否生成 - 用
curl -v -X POST [your_dsn_host]/api/[project_id]/store/ -H "Content-Type: application/json" -d '{"test":1}'测试网络连通性 - CI 2.x 默认禁用 cURL,若使用
curl发送方式,需确认extension=php_curl.dll(Windows)或extension=curl.so(Linux)已启用
真正麻烦的不是配置多难,而是它不吭声——出问题时既不报错也不留痕,得靠手动埋点或抓包才能定位。











