我刚刚在我的 PHP Web 应用程序上设置了 New Relic。一切都很好,除了一件事......所有的交易都显示为通过“index.php”。
这样做的原因是因为我使用Slim 框架(路由有 很多 替代方案 ) 和 URL 重写,这样我就可以拥有像“/user/settings”这样好的人工 URL,而无需为每个控制器和操作创建一个文件夹。
但这仍然让我index.php
成为每个 New Relic 网络交易的名称。
我花了一些时间搜索,但是我能够找到与 CodeIgniter 相关的答案(可在此处获得)。
稍作修改使其对我有用(使用 Slim),我想其他 PHP 路由器和框架将具有大致相同的解决方案:
if (extension_loaded ('newrelic')) {
newrelic_name_transaction($_SERVER['REQUEST_URI']);
}
编辑:为避免包含任何 GET 参数,请在第二行使用:
newrelic_name_transaction(current(explode('?', $_SERVER['REQUEST_URI'])))
注意:如果您使用 Slim,艾默生的回答是他建议使用路由模式,这比使用文字 URL 更好。
您可以使用挂钩将事务名称设置为路由器的名称或模式。
这是一个将其设置为模式的示例:
$app->hook('slim.before.dispatch', function() use ($app) {
newrelic_name_transaction($app->router()->getCurrentRoute()->getPattern());
});
从PHP 代理的6.7.0.174版本开始,New Relic 现在对 Slim 框架提供了开箱即用的支持。
我更新到 NewRelic 代理 6.9.0.182 但交易仍未命名,所以我放置了一个中间件(因为 Slim 3 不再支持挂钩),它工作得更好:
$app = new \Slim\App(['settings' => [
// to be able access to route within middleware
'determineRouteBeforeAppMiddleware' => true,
]]);
// middleware to send the correct route to NewRelic
$app->add(function ($request, $response, $next) {
if (extension_loaded('newrelic') && $request->getAttribute('route')) {
newrelic_name_transaction($request->getAttribute('route')->getPattern());
}
return $next($request, $response);
});
// loads some routes
$app->run();