new relic 监控 codeigniter 的正确方式是安装官方 newrelic.so 扩展,而非第三方包;它能自动捕获路由、控制器和方法名,无需框架适配或手动埋点,但必须确保其在 php-fpm 环境中加载且 license key 配置正确。

NewRelic_CodeIgniter 这个包名本身就是一个常见误解的源头:它不是官方支持的集成方式,也不代表 CodeIgniter 有原生 New Relic 支持。实际能起作用的,只有 New Relic 官方 PHP Agent(即 newrelic.so)——而且它对 CodeIgniter 是完全透明的,不需要任何框架适配代码。
CodeIgniter 项目根本不需要「安装 newrelic-codeigniter」
你搜到的 newrelic-codeigniter 通常指第三方 Composer 包(如 kenjis/codeigniter-newrelic),但它只做两件事:手动打点事务名、记录自定义参数。而现代 New Relic PHP Agent(v10+)已自动识别 CodeIgniter 的请求生命周期,能正确捕获路由、控制器、方法名,无需额外封装。
更关键的是:这类包依赖 newrelic_record_custom_event() 或 newrelic_name_transaction(),但若 newrelic.so 未加载,它们调用直接静默失败,毫无报错提示。
- ✅ 正确路径:装好
newrelic.so,CodeIgniter 请求天然出现在 New Relic 的 «Transactions» 列表里,形如Controller::method - ❌ 错误路径:只
composer require kenjis/codeigniter-newrelic,不装扩展 → 后台零数据,连 «APM overview» 都不显示应用 - ⚠️ 风险操作:在
application/core/MY_Controller.php里硬塞newrelic_name_transaction(),但忘记检查function_exists('newrelic_name_transaction')→ 生产环境 PHP 报Call to undefined function
确认 newrelic.so 是否真正在 CodeIgniter 请求中生效
CodeIgniter 常运行在 PHP-FPM 模式下,而 CLI 和 FPM 加载的 php.ini 是分离的。你在终端跑 php -m | grep newrelic 成功,不代表 Web 请求能用。
必须进到 CodeIgniter 的一个真实页面(比如 /index.php/welcome),加一行临时调试代码:
if (function_exists('newrelic_get_browser_timing_header')) {
echo 'New Relic loaded';
} else {
echo 'New Relic NOT loaded in web SAPI';
}
同时打开浏览器开发者工具的 Network 标签,刷新页面,看是否发出 bam.nr-data.net 请求 —— 这是 New Relic 浏览器端探针注入成功的标志(需开启 newrelic.browser_monitoring.auto_instrument=1)。
- 若页面输出 «NOT loaded»:检查
phpinfo()页面里的 «Loaded Configuration File» 路径,确认newrelic.ini确实被该配置文件所在目录的conf.d/加载 - 若
bam.nr-data.net请求缺失:检查newrelic.browser_monitoring.auto_instrument是否为On,且没有被其他.ini文件覆盖成Off - 若使用 Nginx + PHP-FPM,确保
fastcgi_param PHP_VALUE "newrelic.appname=MyCIApp";这类动态设置没写错位置(应在location ~ \.php$块内)
CodeIgniter 特定场景下的埋点建议(仅当真需要)
绝大多数情况,靠自动捕获就够了。但如果你有特殊需求,比如想把 CodeIgniter 的 $this->benchmark->mark() 时间戳关联到 New Relic 事务里,或标记某个数据库查询为「慢查询人工标记」,才考虑手动干预。
此时应优先用 New Relic 官方函数,而非第三方封装:
-
newrelic_add_custom_parameter('user_id', $this->session->userdata('id'))—— 记录会话级上下文,比写日志更易关联错误 -
newrelic_background_job(true)—— 若你的 CodeIgniter 用cli执行队列任务(如php index.php cron send_email),必须显式声明为后台任务,否则会被归类为 Web 事务并超时丢弃 - 避免在
__destruct()或register_shutdown_function()里调用newrelic_record_custom_event()—— PHP 进程快退出时,New Relic 可能来不及发数据
最后注意:CodeIgniter 3.x 默认关闭 display_errors,而 New Relic 的错误聚合依赖 PHP error_log;若你发现错误率始终为 0,检查 newrelic.error_collector.enabled 是否为 true,且 error_log 没被重定向到 /dev/null。
真正卡住人的从来不是「怎么加监控」,而是以为加了就等于生效 —— 多半是 newrelic.so 没进 FPM 进程,或者 License Key 写在了 CLI 专用的 php.ini 里。











