vinewu/php-profiler

基于XHGui的PHP性能分析库

1.0.0 2024-04-11 07:41 UTC

This package is auto-updated.

Last update: 2024-09-11 08:40:54 UTC


README

一个PHP性能分析库,可以将分析数据提交到 XHGui

支持的性能分析器

此性能分析库将自动检测任何支持的性能分析器并使用它。可以通过 profiler 配置键选择特定的性能分析器。

目标

  • 与PHP >= 5.3.0 兼容
  • 除了相关扩展外没有其他依赖
  • 可定制和配置,以便您可以在其之上构建自己的逻辑

用法

为了分析您的应用程序,您需要

安装

安装此软件包的推荐方式是通过 composer

composer require perftools/php-profiler

创建性能分析器

创建性能分析器可能如下所示

<?php

// Add this block inside some bootstrapper or other "early central point in execution"
try {
    /**
     * The constructor will throw an exception if the environment
     * isn't fit for profiling (extensions missing, other problems)
     */
    $profiler = new \Xhgui\Profiler\Profiler($config);

    // The profiler itself checks whether it should be enabled
    // for request (executes lambda function from config)
    $profiler->start();
} catch (Exception $e){
    // throw away or log error about profiling instantiation failure
}

如果您需要在分析结束时禁用性能分析器执行 flushsession_write_closefastcgi_finish_request,请将 false 传递给注册关闭处理程序

$profiler->start(false);

使用配置文件

您可以创建 config/config.php 并从那里加载配置

  1. config/config.default.php 复制到 config/config.php
  2. 使用 Config::create()new Profiler
// Config::create() will load config/config.default.php
// and then merge with config/config.php (if it exists).
$config = \Xhgui\Profiler\Config::create();
$profiler = new \Xhgui\Profiler\Profiler($config);

高级用法

您可能想自己控制捕获和发送,也许在发送之前修改数据。

/** @var \Xhgui\Profiler\Profiler $profiler */
// start profiling
$profiler->enable($flags, $options);

// run program
foo();

// stop profiler
$profiler_data = $profiler->disable();

// send $profiler_data to saver
$profiler->save($profiler_data);

自动加载器

为了能够分析自动加载器,该项目提供了一个 autoload.php,它加载启动性能分析器所需的类。

在加载composer自动加载器之前加载它

require_once '/path/to/your/project/vendor/perftools/php-profiler/autoload.php';

$profiler = new \Xhgui\Profiler\Profiler($config);
$profiler->start();

require_once '/path/to/your/project/vendor/autoload.php';

当直接将结果保存到MongoDB或PDO时,仍然需要加载composer自动加载器。

配置

配置参考

它包含所有配置选项以及关于选项的内置文档。

保存器

为了将捕获的数据传递给XHGui,您需要一个保存器将其提交到XHGui使用的存储数据。

堆栈保存器

允许保存到多个处理器。

示例配置配置为使用上传保存器,如果失败,则保存到文件保存器

    'save.handler' => \Xhgui\Profiler\Profiler::SAVER_STACK,
    'save.handler.stack' => array(
        'savers' => array(
            \Xhgui\Profiler\Profiler::SAVER_UPLOAD,
            \Xhgui\Profiler\Profiler::SAVER_FILE,
        ),
        // if saveAll=false, break the chain on successful save
        'saveAll' => false,
    ),
    // subhandler specific configs
    'save.handler.file' => array(
        'filename' => '/tmp/xhgui.data.jsonl',
    ),
    'save.handler.upload' => array(
        'url' => 'https://example.com/run/import',
        'timeout' => 3,
        'token' => 'token',
    ),

上传保存器

这是推荐的保存器,因为它最容易设置。

示例配置

    'save.handler' => \Xhgui\Profiler\Profiler::SAVER_UPLOAD,

    // Saving profile data by upload is only recommended with HTTPS
    // endpoints that have IP whitelists applied.
    'save.handler.upload' => array(
        'url' => 'https://example.com/run/import',
        // The timeout option is in seconds and defaults to 3 if unspecified.
        'timeout' => 3,
        // the token must match 'upload.token' config in XHGui
        'token' => 'token',
    ),

文件保存器

如果您的网站无法直接连接到您的XHGui实例,您可以选择将数据保存到临时文件,稍后导入到XHGui。

示例配置

    'save.handler' => \Xhgui\Profiler\Profiler::SAVER_FILE,
    'save.handler.file' => array(
        // Appends jsonlines formatted data to this path
        'filename' => '/tmp/xhgui.data.jsonl',
    ),

有关导入保存文件的说明,请参阅 导入jsonl文件 部分。

MongoDB 保存器

注意:不建议直接保存到MongoDB,请改用上传/文件/堆栈保存器。

要将数据直接保存到MongoDB,您需要为PHP 5安装ext-mongo,为PHP 7安装ext-mongodb,并配合alcaeus/mongo-php-adapter包以及perftools/xhgui-collector包。

对于PHP 5

pecl install mongo
composer require perftools/xhgui-collector

对于PHP 7

pecl install mongodb
composer require perftools/xhgui-collector alcaeus/mongo-php-adapter

示例配置

    'save.handler' => \Xhgui\Profiler\Profiler::SAVER_MONGODB,
    'save.handler.mongodb' => array(
        'dsn' => 'mongodb://127.0.0.1:27017',
        'database' => 'xhprof',
        // Allows you to pass additional options like replicaSet to MongoClient.
        // 'username', 'password' and 'db' (where the user is added)
        'options' => array(),
        // Allows you to pass driver options like ca_file to MongoClient
        'driverOptions' => array(),
    ),

PDO 保存器

注意:不建议直接将数据保存到PDO,请使用Upload/File/Stack保存器。

PDO 保存器应该能够保存到任何PDO驱动连接。

您需要额外安装perftools/xhgui-collector包。

composer require perftools/xhgui-collector

示例配置

    'save.handler' => \Xhgui\Profiler\Profiler::SAVER_PDO,
    'save.handler.pdo' => array(
        'dsn' => 'sqlite:/tmp/xhgui.sqlite3',
        'user' => null,
        'pass' => null,
        'table' => 'results'
    ),

自定义保存器

您可以通过实现SaverInterface并调用setSaver()来创建自己的配置保存器。

use Xhgui\Profiler\Profiler;
use Xhgui\Profiler\Saver\SaverInterface;

class StdOutSaver implements SaverInterface
{
    public function isSupported()
    {
        return true;
    }

    public function save(array $data)
    {
        fwrite(STDOUT, json_encode($data));
    }
}

//...
/** @var Profiler $profiler */
$profiler->setSaver(new StdOutSaver());

导入jsonl文件

您可以使用./bin/import.php脚本来将File Saver保存的文件提交到XHGui服务器。

  1. 设置配置文件
  2. 配置以使用Upload Saver
  3. 执行./bin/import.php脚本

该脚本可以接受多个jsonl格式的文件,如果没有提供,则读取stdin流。

$ ./bin/import.php tests/tmp/php-profiler-xhgui-test-1596093567.787220-c857.json
Imported 1 lines

配置分析率

您可能需要更改应用程序的配置分析频率。配置选项profiler.enable允许您提供一个回调函数,以指定要分析哪些请求。

以下示例配置为分析每100个请求中的1个,排除包含/blog URL路径的请求

    'profiler.enable' => function() {
        $url = $_SERVER['REQUEST_URI'];
        if (strpos($url, '/blog') === 0) {
            return false;
        }

        return mt_rand(1, 100) === 42;
    },

相比之下,以下示例指示分析所有请求

    'profiler.enable' => function() {
        return true;
    },

使用XHProf助手进行分析

如果您想使用基于浏览器的工具(如XHProf helper)开始分析,可以使用此方法

    'profiler.enable' => function() {
        return !empty($_COOKIE['_profiler']);
        // or
        return !empty($_COOKIE['XHProf_Profile']);
    },

配置'简单'URL创建

此库为收集到的每个配置文件生成'简单'URL。这些URL用于生成在URL视图中使用的汇总数据。由于不同的应用程序对URL映射到逻辑代码块块的要求不同,配置选项profile.simple_url允许您提供用于生成简单URL的逻辑。

默认情况下,查询字符串中的所有数值都将被移除。

    'profile.simple_url' => function($url) {
        return preg_replace('/=\d+/', '', $url);
    },

配置忽略的函数

您可以使用配置值profiler.options为分析器扩展设置额外的选项。当您想从分析器数据中排除特定函数时,这很有用。

    'profiler.options' => array(
        'ignored_functions' => array(
            'call_user_func',
            'call_user_func_array',
        ),
    ),
);

此外,如果您不想分析所有PHP内置函数,请在'profiler.flags'中添加ProfilingFlags::NO_BUILTINS

安装分析器

为了捕获分析数据,您需要任何分析器扩展。根据您的环境(PHP版本),您可能需要安装不同的扩展。

支持的性能分析器

Tideways XHProf (5.+)

Tideways XHProf v5.x需要PHP >= 7.0。

要安装tideways_xhprof扩展,请参阅他们的安装文档

或者,在brew(macOS)中,您可以使用来自kabel/pecl tap的包。

brew install kabel/pecl/php@7.4-tideways-xhprof
brew install kabel/pecl/php@8.0-tideways-xhprof
brew install kabel/pecl/php@8.1-tideways-xhprof

对于过时的PHP版本,在glensc/tap tap中存在少量配方。

brew install glensc/tap/php@7.1-tideways-xhprof

XHProf

XHProf支持所有PHP版本。

  • xhprof 0.9.x需要PHP >= 5.3 < PHP 7.0
  • xhprof 2.x需要PHP >= 7.0

对于PHP 5.x

pecl install xhprof-0.9.4

对于PHP >=7.0

pecl install xhprof

或者,在brew(macOS)中,您可以使用来自kabel/pecl tap的包。

brew install kabel/pecl/php@7.4-xhprof
brew install kabel/pecl/php@8.0-xhprof
brew install kabel/pecl/php@8.1-xhprof

Tideways (4.x)

Tideways 4.x扩展需要PHP >= 7.0。

要安装 tideways 扩展,请参阅他们的 安装文档

curl -sSfL https://github.com/tideways/php-xhprof-extension/archive/v4.1.6.tar.gz | tar zx
cd php-xhprof-extension-4.1.6/
phpize
./configure
make
make install
echo extension=/usr/local/lib/php/pecl/20160303/tideways.so | tee /usr/local/etc/php/7.1/conf.d/ext-tideways.ini

UProfiler

UProfiler 需要 PHP >= 5.3,< PHP 7.0

要安装 uprofiler 扩展,请参阅他们的 安装文档