webspark/profiling-laravel

Laravel项目的轻量级性能分析包。

1.0.2 2024-09-09 12:10 UTC

This package is auto-updated.

Last update: 2024-09-09 09:11:12 UTC


README

pipeline coverage release

导航

介绍

此包提供了一个轻量级的PHP性能分析器,用于速度和计时性能分析。它可以用来测量代码执行时间,以及看到代码各部分花费的时间。它可以用来查找代码中的瓶颈,并进行优化。

此包提供两种类型的性能分析

  1. 速度性能分析 - 测量代码执行时间。
  2. 计时性能分析 - 测量代码各部分的时间。

此包易于使用,配置简单。它可以用于任何PHP项目。

工作原理

速度性能分析的工作原理。

使用SpeedProfiler进行性能分析基于使用析构函数作为动作的终点。性能分析代码执行速度从初始化新的SpeedProfiler实例开始,到实例从RAM中清除结束。在PHP中,析构函数在内存清除时自动调用,内存清除发生在进程退出方法时,且方法中的变量不再需要处理代码时。

计时性能分析的工作原理。

计时性能分析基于使用浏览器识别的Server-Timing头部,它可以以可读的形式显示。这允许在浏览器中直接进行实时性能分析。

安装

您可以通过composer安装此包

composer require webspark/profiling-laravel

配置

1. 性能分析配置。

您可以通过在.env文件中指定它们来覆盖默认配置

PROFILING_SPEED_ENABLED={true|false}
PROFILING_SPEED_LATENCY={profiling latency in miliseconds}

PROFILING_TIMINGS_ENABLED={true|false}
PROFILING_TIMINGS_LATENCY={profiling latency in miliseconds}

2. 启用性能分析。

要启用性能分析,您需要将ProfilingServiceProvider添加到您的提供者列表中。之后,您需要在.env文件中启用性能分析

PROFILING_SPEED_ENABLED=true
PROFILING_TIMINGS_ENABLED=true

3. 处理器。

默认情况下,速度性能分析器将使用InMemoryProfilingProcessor来收集性能分析日志。这将为您提供当前页面加载的性能分析统计信息。要收集所有动作的历史日志,您需要创建自己的处理器或使用我们提供的其中一个。您的自定义处理器必须实现一个接口ProfilingProcessorInterface

您可以使用LogChannelProfilingProcessor将性能分析日志存储在Laravel日志文件中。您需要为处理器构造函数提供Laravel日志通道。

要使用自定义处理器,您需要覆盖服务提供者中的速度性能分析器注册

class CustomProfilingServiceProvider extends ProfilingServiceProvider
{
    protected function speedProfilingProcessor(): ProfilingProcessorInterface
    {
        return new LogChannelProfilingProcessor('daily');
    }
}

用法

速度性能分析。

速度性能分析是查看代码执行所需时间的有用工具。您可以将测量结果存储在日志文件中,并检查执行统计信息。

1. 全局动作速度性能分析。

要添加全局性能分析,您应将SpeedProfilingMiddleware添加到您的中间件列表中。它将为您的项目的每个请求启动速度性能分析。

2. 特定位置的速度性能分析。

要记录特定的方法,您需要在该方法开始时创建一个SpeedProfiler类的实例。它会在进程退出方法时记录方法上花费的时间。您可以在代码的任何地方使用它。

class Example
{
    public function execute(): void
    {
        $profiler = new SpeedProfiler('Example execute action.');
        
        ... // some logic
    }
}

3. 速度分析checkpoint方法。

在记录耗时过程中,您可以使用来自SpeedProfiler类的checkpoint方法来记录方法的某些部分。此方法将记录从SpeedProfiler初始化点开始的局部耗时。

class Example
{
    public function execute(): bool
    {
        $profiler = new SpeedProfiler('Example execute action.');
        
        ... // some logic
        
        $profiler->checkpoint('First part of logic');
        
        ... // some logic
        
        $profiler->checkpoint('Second part of logic');
        
        ... // some logic
        
        return true; // method profiling finished
    }
}

4. 速度分析统计。

命令输出包含以下字段:Max - 所有已记录请求中的最大时间,Avg - 所有已记录操作请求的平均时间,Med - 去除最大执行时间和最小执行时间各10%后的所有已记录操作请求的中位数时间,Min - 所有已记录操作请求中的最小时间,Total - 在指定时间段内操作所花费的总时间,Call - 已记录操作请求的数量,Action - 操作名称。

 Max:   57.33   | Avg:   55.16 | Med:   52.32  | Min:   49.33  | Total:   4798.92  | Calls:    87 - App\Http\Controllers\Frontend\Auth\LoginController@login 
 Max:   17.28   | Avg:   15.21 | Med:   14.39  | Min:   13.19  | Total:    654.03  |  Calls:    43 - App\Http\Controllers\Frontend\HomeController@index 
 Sorted by max

Artisan命令名称:profiling:speed-statistic。您可以为日期(默认格式为Y-m-d)、行数限制(默认为10)和排序(默认按最大时间排序)进行指定。

排序可以是:最大(从较大的最大时间到较小的),最小(从较大的最小时间到较小的),平均(从较大的平均时间到较小的),中位数(从较大的中位数时间到较小的),总时间(从较大的总时间到较小的)和调用次数(从较大的调用次数到较小的)。

php artisan profiling:speed-statistic --sort=calls --limit=20 --date=2024-03-25

计时分析。

计时分析是一个有用的工具,可以查看您的代码部分花费了多长时间。您可以在浏览器的网络中的计时部分查看测量结果。

example.png

1. 启用计时分析。

要启用浏览器中的计时,您应该将TimingsProfilingMiddleware添加到您的中间件列表中。

默认情况下,您将拥有以下计时:Bootstrap(框架初始化),App(从检测到路由操作到退出应用程序的时间),以及Database(数据库查询所花费的时间)。

您将在速度分析日志中找到所有计时 - 这对于了解长期操作中代码部分所花费的时间非常有用。

2. 计时测量。

要查看浏览器中的额外测量结果,您需要记录它们。我们有几种方法可以实现这一点。

  • 使用TimingsProfiling外观。例如
public function execute(): void
{
    TimingsProfiling::start('Method execute');
    
    ... // some logic
    
    TimingsProfiling::stop('Method execute');
}

您也可以直接开始计时。它会在您请求提供者头时停止,并包括从起点开始的所有时间。例如

public function execute(): void
{
    TimingsProfiling::start('Method execute');
    
    ... // some logic
}
  • 使用TimingsProfilingsetDuration方法。此方法将记录具有给定持续时间的测量。如果已存在具有此名称的计时测量,则将增加现有持续时间。更好的使用位置是测量重复操作,如数据库查询所花费的时间。它将增加先前完成的测量。例如
$startPoint = microtime(true);

... // some logic
    
TimingsProfiling::setDuration('Measurement', (microtime(true) - $startPoint) * 1000);

您也可以提供回调而不是持续时间值,以测量回调的执行时间。例如

TimingsProfiling::setDuration('Timing name', static function () {
    ... // some logic here
});
  • 使用TimingsProfiler类添加您的计时 - 它会在分析器析构器停止测量,当脚本离开方法时。例如
class Example
{
    public function execute(): void
    {
        $profiler = new TimingsProfiler('Method execute');
        
        ... // some logic
    }
}

测试

composer test

使用覆盖率执行测试

composer test-coverage

变更日志

有关最近更改的更多信息,请参阅变更日志

许可证

MIT许可(MIT)。有关更多信息,请参阅许可文件