新遗迹是';我不认识我的Slim PHP路线


Newrelic isn't recognizing my Slim PHP routes

我刚刚在我的PHP web应用程序上设置了NewRelic。一切都很顺利,只有一件事。。。所有事务都显示为通过"index.php".

原因是我使用了Slim框架(有很多路由选择)和URL重写,这样我就可以拥有像"/user/settings"这样的漂亮的人工URL,而不需要为每个控制器和操作设置文件夹。

但这仍然让我把index.php作为每个NewRelic web事务的名称。

您可以使用钩子将事务名称设置为路由器的名称或模式。

下面是一个将其设置为模式的示例:

$app->hook('slim.before.dispatch', function() use ($app) {
    newrelic_name_transaction($app->router()->getCurrentRoute()->getPattern());
});

我花了一些时间进行搜索,但我找到了与CodeIgniter相关的答案(此处可用)。

一点修改使它对我(使用Slim)有效,我想其他PHP路由器和框架也会有大致相同的解决方案:

if (extension_loaded ('newrelic')) {
    newrelic_name_transaction($_SERVER['REQUEST_URI']);
}

编辑:为了避免包含任何GET参数,请在第二行使用:

newrelic_name_transaction(current(explode('?', $_SERVER['REQUEST_URI'])))

注意:Emerson的答案是,如果你使用Slim,他建议使用路由模式,这比使用字面URL要好得多

New Relic现在对Slim Framework提供了开箱即用的支持,从6.7.0.174版本的PHP Agent开始。

我更新到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();