简单的PHP性能分析器,用于在开发过程中跟踪应用程序行为

1.1.0 2016-01-29 12:57 UTC

README

Build Status Code Climate Test Coverage Scrutinizer Code Quality

PHP快速性能分析器是一个简单的性能分析器,用于在开发过程中跟踪应用程序行为。

安装

建议您使用 Composer 安装PHP快速性能分析器。

$ composer require particletree/pqp "^1.0"

这将安装PHP快速性能分析器。它需要PHP 5.3.0或更高版本。

使用方法

基本性能分析器只需要几行代码即可启动。如果您想添加查询分析,则需要独立跟踪查询并在渲染前注入它们。

对于基本性能分析器

<?php

$console = new Particletree\Pqp\Console();
$profiler = new Particletree\Pqp\PhpQuickProfiler();
$profiler->setConsole($console);

// let the application do its thing
$console->log('Hello World');
$console->logSpeed();

// after the app shutdown - will spew out HTML
$profiler->display();

这将输出一些样式化的HTML,位于页面底部,并显示一些消息。只有当调用 Profiler::display() 时,HTML才会显示,因此如果您想隐藏数据(例如,在生产环境中),则只需在该调用中添加检查即可。

控制台

Console类是日志信息的简单持有者。最佳处理方法是创建一个新实例,并将其放入容器/服务定位器中,然后在您的应用程序中传递内容。最坏的情况下,您可以将其放入 $_GLOBALS 数组中,但我不推荐这样做。

注意:原始的Particletree版本将此类作为一个伪静态单例。这个版本不再这样做。Console类遵循更正常的实例化模式,并且它的方法不应作为静态引用。

Console::log()

此日志方法将字符串或其他任何变量记录到显示的 'messages' 区域。任何可以使用 print_r 处理的内容都可以传递。

$console = new Particletree\Pqp\Console();
$console->log('A String');

$array = array('a value');
$console->log($array);

Console::logMemory()

此日志方法可以记录应用程序的当前内存使用情况(用于基准测试)或给定对象的内存使用情况。

$console = new Particletree\Pqp\Console();
$console->logMemory();

$date = new Datetime('+5 days');
$console->logMemory($date, 'five days from now');

Console::logError()

此日志方法从异常对象中提取一些信息以供显示。您可以将它与错误处理程序连接起来以跟踪意外错误,尽管显示的数据的准确性可能不足。

$console = new Particletree\Pqp\Console();
try {
  // bad code
} catch (Exception $e) {
  $console->logError($e);
}

Console::logSpeed()

此日志方法会捕捉当前时间的快照。这个快照的有用性取决于您如何设置性能分析器的启动时间。

$console = new Particletree\Pqp\Console();
$console->logSpeed('right now');
// some code
$console->logSpeed('a bit later');

PhpQuickProfiler

PhpQuickProfiler类处理基本系统指标的收集,执行一些映射,并将数据传递给显示对象。它还会处理查询分析,如果您适当地设置了这些设置。

PhpQuickProfiler::__construct()

此方法返回性能分析器的新实例(这里没有惊喜)。唯一的陷阱是计时。如果您对跟踪加载时间和准确的速度点感兴趣,您需要了解何时实例化此对象。

默认情况下,所有已过的时间都是以对象构造时为基准的。因此,您希望在应用程序的早期创建 PhpQuickProfiler 的实例。如果您想等待创建,则 PhpQuickProfiler::__construct() 的第一个参数可以是代表应用程序启动时间的微时间戳双精度浮点数。

$profiler = new Particletree\Pqp\PhpQuickProfiler();
// let the application do its thing

// or
$startTime = microtime(true);
// let the application do its thing
$profiler = new Particletree\Pqp\PhpQuickProfiler($startTime);

PhpQuickProfiler::setConsole()

此方法设置包含应用运行时所有相关日志信息的控制台对象。这与原始的Particletree不同,在原始Particletree中,分析器“假定”全局静态控制台对象将包含数据。

$console = new Particletree\Pqp\Console();
$profiler = new Particletree\Pqp\PhpQuickProfiler();
$profiler->setConsole($console);

// profiler will now pass any logs to Console off to the Display class
$console->log('A string');

PhpQuickProfiler::setDisplay()

此方法将自定义的Display对象设置到分析器中,以便稍后调用。这与原始的Particletree不同,原始Particletree没有Display对象的概念。因此,此方法是可选的。如果不使用它,将使用干净的Display对象进行显示。

$profiler = new Particletree\Pqp\PhpQuickProfiler();
$profiler->setDisplay(new Particletree\Pqp\Display());

请参阅Display类以了解一些选项。

PhpQuickProfiler::setProfiledQueries()

此方法发送查询分析信息列表以进行分析。此信息必须以预期的格式传递。虽然此方法是可选的,但它是传递查询分析数据的一种简单方式。

$profiler = new Particletree\Pqp\PhpQuickProfiler();

$profiledQueries = [
  [
    'sql' => 'SELECT * FROM posts WHERE active = :active',
    'parameters' => ['active' => 1],
    'time' => 5,
  ],
  [
    'sql' => 'UPDATE posts SET active = :active WHERE id = :id',
    'parameters' => ['active' => 1, 'id' => 5],
    'time' => 1,
  ],
];

$profiler->setProfiledQueries($profiledQueries);

格式非常重要,因为任何偏差都不会被理解。例如,Aura.Sql 包含一个可选的分析器,该分析器以更现代的格式返回数据。为了映射到这个预期的格式,你必须进行一些操作。

$profiledQueries = $pdo->getProfiler()->getProfiles();
$profiledQueries = array_filter($profiledQueries, function ($profile) {
  return $profile['function'] == 'perform';
});
$profiledQueries = array_map(function ($profile) {
  return array(
    'sql' => trim(preg_replace('/\s+/', ' ', $profile['statement'])),
    'parameters' => $profile['bind_values'],
    'time' => $profile['duration']
  );
}, $profiledQueries);

任何可以通过添加EXPLAIN来处理的表达式都可以传递给这个方法。另外,为了使这个方法生效,你必须将数据库连接传递到下面的display方法。

PhpQuickProfiler::display()

此方法启动显示功能,基本上是输出HTML和样式等。它还会启动大量的查询分析和指标收集,这会消耗一些内存(不是很多),因此建议仅在开发或受控环境中调用此方法。它接受单个参数,即必须具有基本PDO-like接口的数据库连接。

$profiler = new Particletree\Pqp\PhpQuickProfiler();
$db = new PDO(..);
$profiler->display($db);

总结一下,为了使查询分析生效,你必须传递此数据库连接并执行以下两个操作之一:

  • 在调用显示之前,将profiledQueries注入到PhpQuickProfiler::setProfiledQueries()中,或者
  • 数据库连接具有名为queries的属性,其中包含以预期格式存储的分析查询数组。

第二个选项是为了与原始Particletree发布保持半向后兼容。

Display

Display类通常不与用户交互。它将PhpQuickProfiler中的数据转换成适合显示的格式。它有几个可选的构造方法,这些方法需要在未来的版本中进一步完善。

测试

要执行测试套件,你需要phpunit(以及安装具有开发依赖项的包)。

$ phpunit

贡献

有关详细信息,请参阅CONTRIBUTING

了解更多信息

致谢

  • Ryan Campbell(原始)
  • Kevin Hale(原始)
  • Jacob Emerick(重构)

许可证

PHP Quick Profiler在MIT许可证下授权。有关更多信息,请参阅许可证文件