fabfuel/prophiler

为Phalcon构建的PHP性能分析器和开发者工具栏

1.6.0 2017-09-16 06:49 UTC

This package is not auto-updated.

Last update: 2024-09-14 16:24:11 UTC


README

Scrutinizer Code Quality Code Coverage Build Status License Latest Stable Version

演示

演示网站已移动到单独的仓库: https://github.com/fabfuel/prophiler-demo

在这里您可以查看工具栏的实际操作: http://prophiler.fabfuel.de/demo.php

Timeline Preview

安装

您可以使用composer安装Prophiler。只需将其作为依赖项添加即可

"require": {
   	"fabfuel/prophiler": "~1.0",
}

设置(常规)

通过以下简单步骤设置Prophiler和开发者工具栏。您可以在您的入口控制器(例如Phalcon中的public/index.php)中完成所有设置

1. 初始化性能分析器(尽可能早)

通常最好尽早初始化性能分析器,以便测量尽可能多的执行时间。您应该在入口控制器或引导文件中,在引入Composer自动加载器后立即初始化性能分析器。

$profiler = new \Fabfuel\Prophiler\Profiler();

2. 初始化和注册工具栏

为了可视化性能分析结果,您必须初始化并渲染性能分析器工具栏。此组件负责渲染性能分析器基准测试的所有结果和其他数据收集器。将其放在入口控制器的末尾。

您还可以将其他数据收集器添加到工具栏中,例如显示请求数据,如本示例所示。

$toolbar = new \Fabfuel\Prophiler\Toolbar($profiler);
$toolbar->addDataCollector(new \Fabfuel\Prophiler\DataCollector\Request());
echo $toolbar->render();

您还可以轻松创建自己的数据收集器,通过实现DataCollectorInterface并将其实例添加到工具栏中。

...
$toolbar->addDataCollector(new \My\Custom\DataCollector());
...

Phalcon应用程序的额外设置

1. 将性能分析器添加到依赖注入容器

将性能分析器实例添加到DI容器中,以便其他插件和适配器可以在整个应用程序中使用它。这应该在您的常规DI设置中或之后完成。

$di->setShared('profiler', $profiler);

2. 初始化插件管理器

插件管理器自动注册所有包含的Phalcon插件并将它们附加到事件管理器。为了使插件正常工作,请确保默认事件管理器附加到您的Dispatcher、View和Connection服务。

$pluginManager = new \Fabfuel\Prophiler\Plugin\Manager\Phalcon($profiler);
$pluginManager->register();

自定义基准测试

您可以轻松地将自定义基准测试添加到代码中

$benchmark = $profiler->start('\My\Class::doSomething', ['additional' => 'information'], 'My Component');
...
$profiler->stop($benchmark);

或停止而无需传递基准测试

在某些场景(例如自定义适配器)中,可能很难将接收到的基准测试传递给stop()方法。作为替代方案,您可以简单地省略$benchmark参数。如果是这种情况,性能分析器将简单地停止最后一个启动的基准测试,但是无法运行重叠的基准测试。

$profiler->start('\My\Class::doSomeOtherThing', ['additional' => 'information'], 'My Component');
...
$profiler->stop();

聚合

Prophiler现在具有基准测试聚合功能。这些功能为您提供了更多的见解,并且非常有用

  • 快速查看重复执行的总体次数(例如数据库或缓存查询)
  • 分析重复执行的最低、最高和平均执行时间
  • 轻松查看(例如意外)重复执行相同的数据库查询
  • 如果执行次数超过自定义阈值,则发出警告
  • 如果最大执行时间超过自定义阈值,则发出警告

设置

Prophiler附带一些聚合器,但您可以轻松创建自己的聚合器。要设置聚合器,您只需在性能分析器实例中注册聚合器即可

$profiler->addAggregator(new \Fabfuel\Prophiler\Aggregator\Database\QueryAggregator());
$profiler->addAggregator(new \Fabfuel\Prophiler\Aggregator\Cache\CacheAggregator());

这就完成了。您可以立即看到所有数据库和缓存查询,按命令/查询分组,包括执行总数、所有执行的持续时间以及最小、最大和平均执行时间。

日志记录

您可以使用Prophiler来记录事件和其他数据,并在时间轴以及单独的“日志”标签中查看。如果您已经有日志记录基础设施,您可以将PSR-3兼容的Logger适配器添加到其中。否则,您也可以直接实例化并使用它。

$logger = new \Fabfuel\Prophiler\Adapter\Psr\Log\Logger($profiler);
$logger->warning('This is a warning!', ['some' => 'context']);
$logger->debug('Some debugging information', ['query' => ['user' => 12345], 'foo' => 'bar']);

适配器和装饰器

Doctrine

要分析Doctrine执行的所有SQL查询,您只需在Doctrine配置中注册SQLLogger适配器即可,例如在您的bootstrap.php中这样

$sqlLogger = new Fabfuel\Prophiler\Adapter\Doctrine\SQLLogger($profiler);
$entityManager->getConnection()->getConfiguration()->setSQLLogger($sqlLogger);

PDO

要分析您的PDO数据库操作,您可以使用Prophiler PDO装饰器。它将记录所有query()exec()调用以及预处理语句。只需用Prophiler装饰器装饰您的PDO实例,并用它来代替

$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'password');
$db = new \Fabfuel\Prophiler\Decorator\PDO\PDO($pdo, $profiler);

$db->query('SELECT * from users');
$db->exec('DELETE FROM users WHERE active = 0');
$db->prepare('SELECT * from users WHERE userId = ?');

缓存

要分析Phalcon缓存后端请求,您只需要用BackendDecorator装饰缓存后端。它将自动基准测试所有缓存操作。以下是一个使用APC后端的示例

$cacheFrontend = new \Phalcon\Cache\Frontend\Data(['lifetime' => 172800]);
$cacheBackend = new \Phalcon\Cache\Backend\Apc($cacheFrontend, ['prefix' => 'app-data']);

$cache = \Fabfuel\Prophiler\Decorator\Phalcon\Cache\BackendDecorator($cacheBackend, $profiler);

Elasticsearch

要分析Elasticsearch请求,您只需要用ClientDecorator装饰Elasticsearch客户端

$elasticsearch = new Elasticsearch\Client(['your' => 'config']);
$client = new \Fabfuel\Prophiler\Decorator\Elasticsearch\ClientDecorator($client, $profiler);

提示

记录会话写入

要记录会话写入,您可以在渲染工具栏之前提交(这也称为session_write_close())会话

session_commit();