CodeIgniter 3/4 均不原生支持 Raygun,需手动集成:CI3 用钩子注册异常处理器并加载 SDK,CI4 需重写 ExceptionHandler 类;均须补充请求上下文、过滤敏感数据、加 try/catch 防阻塞。

CodeIgniter 本身不内置 Raygun 集成,Raygun_CodeIgniter 是一个第三方扩展包,但该包早已停止维护(最后更新在 CodeIgniter 2.x 时代),在 CI3 或 CI4 中直接使用会失败。
Raygun_CodeIgniter 在 CI3/CI4 中无法直接工作
这个包依赖 Raygun4PHP v1.x,而后者早在 2017 年就已归档,不再兼容 PHP 7.2+ 和现代 autoloader(如 Composer PSR-4)。尝试 require 它会导致:
-
Class 'Raygun\RaygunClient' not found(类未加载) -
Call to undefined method CI_Exceptions::get_error()(CI3 的异常处理接口已变更) - CI4 中根本找不到
CI_Exceptions类,整个错误捕获机制重构为CodeIgniter\Exceptions命名空间
CI3 正确接入 Raygun 的方式是用官方 SDK + 自定义异常钩子
Raygun 官方维护的 raygun4php 虽已归档,但其源码仍可运行;更稳妥的是改用当前活跃的 raygun4php 替代实现(如社区维护的 spatie/raygun-php),或直接调用 Raygun API。实操建议如下:
- 在
application/config/hooks.php中启用钩子:$config['enable_hooks'] = TRUE; - 创建
application/hooks/RaygunHook.php,在post_system钩子中注册全局异常处理器:set_exception_handler()和set_error_handler() - 在 handler 内实例化
RaygunClient(需先require_onceSDK 文件或通过 Composer 加载) - 注意:不要在
show_error()或show_404()中手动调用 Raygun——这些函数只用于渲染页面,不捕获未处理异常
CI4 接入 Raygun 必须重写 Exceptions 类
CI4 的异常流程完全由 Config\Exceptions 和 CodeIgniter\Exceptions\ExceptionHandler 控制,无法靠钩子干预。正确做法是:
- 复制
vendor/codeigniter4/framework/system/Exceptions/ExceptionHandler.php到app/Exceptions/ExceptionHandler.php - 重写
handleException()和handleError()方法,在调用父逻辑前,用new \Raygun\RaygunClient('YOUR_API_KEY')发送数据 - 确保
app/Config/Exceptions.php中的$handles数组包含你自定义的类路径 - 避免在 CLI 模式下重复上报:检查
is_cli()并跳过RaygunClient->Send()
Raygun 上报内容容易漏掉关键上下文
默认只发异常消息和堆栈,但 CI 应用真正需要的是请求上下文(如当前 URI、POST 数据、Session ID)。Raygun SDK 支持 withCustomData(),但必须手动注入:
- CI3:从
get_instance()获取$this->input、$this->session等对象拼装数组 - CI4:用
service('request')、service('session')提取数据,注意过滤敏感字段(如密码、token) - 不要传整个
$_SERVER——Raygun 有 payload 大小限制(默认 128KB),超限会静默丢弃
最常被忽略的一点:Raygun 的 Send() 是同步阻塞调用,若网络延迟高或服务不可用,会拖慢整个错误响应。生产环境务必加 try/catch 包裹,并设超时(SDK 不自带,需自己用 stream_context_set_option() 控制 HTTP 请求)。


















