基于 xhprof 对 Laravel6 进行性能分析

基于 xhprof 的性能分析

XHProf 是一个函数层级的性能分析工具,并提供一个简单的基于 HTML 的报告展示页面。

项目地址:github.com/phacility/xhprof
扩展地址:pecl.php.net/package/xhprof

安装扩展

Pecl 安装

$ wget http://pecl.php.net/get/xhprof-2.2.0.tgz
$ pecl install xhprof-2.2.0.tgz

编译安装

# 到 Github 下载指定版本的扩展源码
$ cd xhprof-src
$ phpize
$ ./configure
$ make && make install

检查安装结果

$ php -m | grep xhprof 
xhprof

对 Laravel 框架进行性能分析

首先准备一份Laravel6 项目代码:

composer create-project --prefer-dist laravel/laravel laravel-xhprof-test v6.0.2

对下载的压缩包 xhprof-2.2.0.tgz 进行解压,并拷贝到项目根目录下,分析结果需要用此库进行保存。

编辑项目入口文件 public/index.php 添加:

// 开启分析
xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);

$app = require_once __DIR__.'/../bootstrap/app.php';
// ...
$kernel->terminate($request, $response);

// 结束分析
$xhprof_data = xhprof_disable();

// 保存结果
$XHPROF_ROOT = base_path('/xhprof-2.2.0/xhprof-2.2.0/');
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";

$xhprof_runs = new XHProfRuns_Default();
// 保存分析结果,默认存储在 `sys_get_temp_dir()` 目录中
$xhprof_runs->save_run($xhprof_data, "xhprof_laravel_testing");

启动 Laravel Server 服务

$ php artisan serve
Laravel development server started: http://127.0.0.1:8000

访问:127.0.0.1:8000

查看分析接口

$ cd xhprof-2.2.0/xhprof-2.2.0
$ php -S localhost:8001
PHP 7.2.25 Development Server started at Fri Aug 14 14:56:40 2020
Listening on http://localhost:8001
Document root is /Users/helingfeng/laravel-xhprof-test/xhprof-2.2.0/xhprof-2.2.0
Press Ctrl-C to quit.

访问:localhost:8001/xhprof_html

开启 Laravel 配置和路由缓存,对比性能分析结果

什么都不做,直接访问页面

# 不开启缓存分析结果
Overall Summary    
Total Incl. Wall Time (microsec):    69,918 microsecs
Total Incl. CPU (microsecs):    68,252 microsecs
Total Incl. MemUse (bytes):    4,459,944 bytes
Total Incl. PeakMemUse (bytes):    4,461,968 bytes
Number of Function Calls:    22,285

开启配置缓存,路由缓存

$ php artisan config:cache
$ php artisan route:cache

# 开启缓存分析结果
Overall Summary    
Total Incl. Wall Time (microsec):    44,372 microsecs
Total Incl. CPU (microsecs):    43,643 microsecs
Total Incl. MemUse (bytes):    4,101,176 bytes
Total Incl. PeakMemUse (bytes):    4,153,032 bytes
Number of Function Calls:    13,993

对比两次结果,可以发现还是有比较大的差距的,Total Incl. CPU (microsecs) 从 68ms 下降到 43ms 。Number of Function Calls 函数调用次数从 22,285 下降到 13,993

指标含义:

  • Calls:方法被调用的次数。
  • Calls%:方法调用次数在同级方法总数调用次数中所占的百分比。
  • Incl.Wall Time(microsec):方法执行花费的时间,包括子方法的执行时间。(单位:微秒)
  • IWall%:方法执行花费的时间百分比。
  • Excl. Wall Time(microsec):方法本身执行花费的时间,不包括子方法的执行时间。(单位:微秒)
  • EWall%:方法本身执行花费的时间百分比。
  • Incl. CPU(microsecs):方法执行花费的CPU时间,包括子方法的执行时间。(单位:微秒)
  • ICpu%:方法执行花费的CPU时间百分比。
  • Excl. CPU(microsec):方法本身执行花费的CPU时间,不包括子方法的执行时间。(单位:微秒)
  • ECPU%:方法本身执行花费的CPU时间百分比。
  • Incl.MemUse(bytes):方法执行占用的内存,包括子方法执行占用的内存。(单位:字节)
  • IMemUse%:方法执行占用的内存百分比。
  • Excl.MemUse(bytes):方法本身执行占用的内存,不包括子方法执行占用的内存。(单位:字节)
  • EMemUse%:方法本身执行占用的内存百分比。
  • Incl.PeakMemUse(bytes):Incl.MemUse峰值。(单位:字节)
  • IPeakMemUse%:Incl.MemUse峰值百分比。
  • Excl.PeakMemUse(bytes):Excl.MemUse峰值。单位:(字节)
  • EPeakMemUse%:Excl.MemUse峰值百分比。
本作品采用《CC 协议》,转载必须注明作者和本文链接
Sparkfly
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!