webspark / profiling-laravel
Laravel项目的轻量级性能分析包。
Requires
- php: ^7.4|^8.0|^8.1|^8.2|^8.3
- ext-json: *
- illuminate/support: 5.8.*|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0
- webspark/profiling-php: ^1.0.0
Requires (Dev)
- orchestra/testbench: 8.*
- pestphp/pest: 2.34.7
- pestphp/pest-plugin-type-coverage: 2.8.1
README
导航
介绍
此包提供了一个轻量级的PHP性能分析器,用于速度和计时性能分析。它可以用来测量代码执行时间,以及看到代码各部分花费的时间。它可以用来查找代码中的瓶颈,并进行优化。
此包提供两种类型的性能分析
- 速度性能分析 - 测量代码执行时间。
- 计时性能分析 - 测量代码各部分的时间。
此包易于使用,配置简单。它可以用于任何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
计时分析。
计时分析是一个有用的工具,可以查看您的代码部分花费了多长时间。您可以在浏览器的网络中的计时部分查看测量结果。
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
}
- 使用
TimingsProfiling
的setDuration
方法。此方法将记录具有给定持续时间的测量。如果已存在具有此名称的计时测量,则将增加现有持续时间。更好的使用位置是测量重复操作,如数据库查询所花费的时间。它将增加先前完成的测量。例如
$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)。有关更多信息,请参阅许可文件。