fabfuel / prophiler
为Phalcon构建的PHP性能分析器和开发者工具栏
Requires
- php: >=5.5
- psr/log: ~1.0
Requires (Dev)
- container-interop/container-interop: ^1.1
- doctrine/orm: ~2.4
- elasticsearch/elasticsearch: ~1.3
- fabfuel/mongo: ~0.4
- phalcon/devtools: 1.3.*@dev
- phpmd/phpmd: ~1.0
- phpunit/phpunit: ~4.0
- squizlabs/php_codesniffer: ~1.0
Suggests
- fabfuel/mongo: ORM for Mongo, supports lazy loading, object references, subdocument classes and their collections.
- phalcon/devtools: This tools provide you useful scripts, helping to develop applications that use with Phalcon.
This package is not auto-updated.
Last update: 2024-09-14 16:24:11 UTC
README
演示
演示网站已移动到单独的仓库: https://github.com/fabfuel/prophiler-demo
在这里您可以查看工具栏的实际操作: http://prophiler.fabfuel.de/demo.php
安装
您可以使用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();