davihu/prophiler

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

dev-master 2017-10-06 18:19 UTC

This package is not auto-updated.

Last update: 2024-09-15 03:49:58 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. 初始化并注册工具栏

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

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

$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();