Newrelic isn';我认不出我苗条的PHP路线

Newrelic isn';我认不出我苗条的PHP路线,php,url-rewriting,frameworks,slim,newrelic,Php,Url Rewriting,Frameworks,Slim,Newrelic,我刚刚在我的PHP web应用程序上设置了New Relic。除了一件事外,一切都很顺利。。。所有事务都显示为通过“index.php” 之所以这样做,是因为我正在使用(there)进行URL重写,这样我就可以拥有像“/user/settings”这样的漂亮的人工URL,而不必为每个控制器和操作设置文件夹 但这仍然让我把index.php作为每个NewRelic web事务的名称。我花了一些时间进行搜索,但是我找到了与CodeIgniter相关的答案() 稍加修改(使用Slim)就可以让它对我起

我刚刚在我的PHP web应用程序上设置了New Relic。除了一件事外,一切都很顺利。。。所有事务都显示为通过“index.php”

之所以这样做,是因为我正在使用(there)进行URL重写,这样我就可以拥有像“/user/settings”这样的漂亮的人工URL,而不必为每个控制器和操作设置文件夹


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

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

稍加修改(使用Slim)就可以让它对我起作用,我想其他PHP路由器和框架也会有大致相同的解决方案:

if (extension_loaded ('newrelic')) {
    newrelic_name_transaction($_SERVER['REQUEST_URI']);
}
编辑:要避免包含任何GET参数,请在第二行使用此选项:

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

注意:Emerson的答案(他建议使用路由模式)比使用文本URL(如果您使用Slim)要好得多。

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

以下是将其设置为模式的示例:

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

New Relic现在对Slim框架提供了开箱即用的支持,从PHP代理版本开始。

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

你可能想看看这个:“你绝对不应该在事务名称中包含任何特定于请求的数据。因此,例如,使用实际的请求URL是非常糟糕的。”他们这样说,但他们并没有真正提供一个替代方案。我认为在许多情况下,请求URL对人们没有用处。例如,如果你有一个拥有10000种产品的电子商务网站,你会希望“产品页面”是一个单独的动作,而不是10000个单独的动作。否则,很难从报告UI中获得更多信息。