7

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

这样做的原因是因为我使用Slim 框架路由 很多 替代方案 和 URL 重写,这样我就可以拥有像“/user/settings”这样好的人工 URL,而无需为每个控制器和操作创建一个文件夹。

但这仍然让我index.php成为每个 New Relic 网络交易的名称。

4

4 回答 4

8

我花了一些时间搜索,但是我能够找到与 CodeIgniter 相关的答案(可在此处获得)。

稍作修改使其对我有用(使用 Slim),我想其他 PHP 路由器和框架将具有大致相同的解决方案:

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

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

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

注意:如果您使用 Slim,艾默生的回答是他建议使用路由模式,这比使用文字 URL 更好。

于 2013-07-25T14:14:06.503 回答
8

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

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

$app->hook('slim.before.dispatch', function() use ($app) {
    newrelic_name_transaction($app->router()->getCurrentRoute()->getPattern());
});
于 2014-01-03T00:38:59.693 回答
1

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

于 2016-09-21T21:07:07.423 回答
0

我更新到 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();
于 2017-02-02T13:03:47.067 回答