使用XHProf查找PHP性能瓶颈
使用XHProf查找PHP性能瓶颈
XHProf是facebook 开发的一个测试php性能的扩展,本文记录了在PHP应用中使用XHProf对PHP进行性能优化,查找性能瓶颈的方法。
下载
网上很多是编译安装xhprof-0.9.4版本,应该是用php5,在php8.0下编译xhprof-0.9.4各种报错(编译安装这个拓展 tideways 不会报错),php7、php8环境下,建议下载最新版本
https://pecl.php.net/package/xhprof
安装Xhprof扩展
cd /opt
wget https://pecl.php.net/get/xhprof-2.3.9.tgz
tar -zxvf xhprof-2.3.9.tgz
cd xhprof-2.3.9
cd extension/
phpize
./configure
make && make install
修改php.ini
[xhprof]
extension=xhprof.so
xhprof.output_dir=/tmp
配置中
xhprof.output_dir指定了生成的profile文件存储的位置,我们将其指定为/tmp。
对PHP进行性能分析
在XHProf扩展中,一共提供了四个函数用于对PHP进行性能分析。
xhprof_enable/xhprof_sample_enable函数用于开始XHProf性能分析,区别在于前者功能更加强大,而后者则是是以简单模式启动性能分析(简单记录了函数的调用栈信息),开销比较小。
xhprof_disable/xhprof_sample_disable函数用于停止性能分析,并返回分析的数据。
需要特别说明的函数是xhprof_enable,其他函数都是不需要提供参数的,而该函数则可以接受两个可选的参数,用于改变该工具的行为。
void xhprof_enable ([ int $flags = 0 [, array $options ]] )
-
flags 该参数用于为剖析结果添加额外的信息,该参数的值使用以下宏,如果需要提供多个值,使用
|进行分隔。 -
XHPROF_FLAGS_NO_BUILTINS 跳过所有的内置函数
-
XHPROF_FLAGS_CPU 添加对CPU使用的分析
-
XHPROF_FLAGS_MEMORY 添加对内存使用的分析
-
options 数组形式提供可选参数,在此处提供
ignored_functions选项需要忽略的函数
比如下面的例子,同时对内存和CPU进行分析,并且忽略对call_user_func和call_user_func_array函数的分析。
xhprof_enable(XHPROF_FLAGS_MEMORY|XHPROF_FLAGS_CPU,['ignored_functions' => ['call_user_func','call_user_func_array']]
);// 这里是PHP代码,比如业务逻辑实现等要被分析的代码部分
....$xhprofData = xhprof_disable();// $xhprofData是数组形式的分析结果
print_r($xhprofData);
注意,如果使用
XHPROF_FLAGS_CPU选项对CPU占用也进行分析,在Linux环境下,会造成比较高的系统负载,因此不建议使用,而推荐只使用XHPROF_FLAGS_MEMORY,对内存的分析不会对系统造成太多负载。
形象化的查看分析结果
安装graphviz
使用xhprof_disable完成性能分析并且获取到分析结果之后,我们通常不会直接输出结果,因为这样的结果是以数组形式组织的,看起来并不直观,幸运的是,xhprof提供了基于web的图形界面对分析结果进行查看。
在使用之前,请先确保服务器安装了graphviz工具,否则在生成监控图表的时候回出现以下错误:
failed to execute cmd: " dot -Tpng". stderr: `sh: dot: command not found '
这里提示找不到dot命令,所以需要先安装graphviz
yum -y install graphviz
将xhprof安装包中的xhprof_html_和xhproflib目录放到服务器的web目录下
由于分析结果的查看工具是基于web的,因此,我们需要将xhprof安装包中的xhprof_html_和xhproflib目录放到服务器的web目录下,让xhprof_html目录中的内容对外可以访问。
比如我的测试服务器环境是使用vagrant搭建的CentOS,这两个目录放到/opt/xhprof-2.3.9目录下:
cp -r /opt/xhprof-2.3.9/xhprof_html/ /www/nginx/php/xhprof_html
cp -r /opt/xhprof-2.3.9/xhprof_lib/ /www/nginx/php/xhprof_lib
web服务器使用的是Nginx,因此,修改Nginx的配置文件nginx.conf中的配置如下:
server {location / {root /www/nginx/php;#等于php;index index.php index.html index.htm;}location ~ \.php$ {root /www/nginx/php;fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #支持解析php文件include fastcgi_params;}
使用
修改我们的代码,是其能够将分析结果存放到xhprof.output_dir(上面在php.ini设置的xhprof.output_dir=/tmp)指定的目录中。
在 PHP 页面顶部加上:
xhprof_enable(XHPROF_FLAGS_NO_BUILTINS + XHPROF_FLAGS_MEMORY);
在页面底部加上:
$xhprofData = xhprof_disable();
require '/vagrant/xhprof/xhprof_lib/utils/xhprof_lib.php';
require '/vagrant/xhprof/xhprof_lib/utils/xhprof_runs.php';$xhprofRuns = new XHProfRuns_Default();//数据会保存在php.ini中xhprof.output_dir设置的目录去中
$runId = $xhprofRuns->save_run($xhprofData, 'xhprof_test');//第二个参数是定义文件名称echo 'http://ip/xhprof/xhprof_html/index.php?run=' . $runId . '&source=xhprof_test';
变量$runId是本次请求生成分析结果的id,最后我们访问http://访问http://ip 页面输出了一个链接地址,使用该地址就可以看到本次请求的分析结果。

注意到中间的View Full Callgraph链接,通过该链接我们可以看到图形化的分析结果。

查看安装结果
[root@xxx /]# php -i | grep xhprof
xhprof
xhprof support => enabled
xhprof.collect_additional_info => 0 => 0
xhprof.output_dir => /tmp => /tmp
xhprof.sampling_depth => 2147483647 => 2147483647
xhprof.sampling_interval => 100000 => 100000
查看分析结果文件
[root@xxx /]# tree /tmp
/tmp
└── systemd-private-be08ad52244846b793f9a5c4600bb4dc-php-fpm.service-UXT6oP└── tmp├── 655f4470f21de.xhprof_test.xhprof└── 655f48cb6e9bf.xhprof_test.xhprof[root@xxx /]# cat /tmp/systemd-private-be08ad52244846b793f9a5c4600bb4dc-php-fpm.service-UXT6oP/tmp/655f4470f21de.xhprof_test.xhprof
a:1:{s:6:"main()";a:4:{s:2:"ct";i:1;s:2:"wt";i:889;s:2:"mu";i:61200;s:3:"pmu";i:25216;}}
得到的是serialize后的数据
<?php
$str = 'a:1:{s:6:"main()";a:4:{s:2:"ct";i:1;s:2:"wt";i:889;s:2:"mu";i:61200;s:3:"pmu";i:25216;}}';
$arr = unserialize($str);
var_dump($arr);
array(1) {["main()"]=>array(4) {["ct"]=>int(1)["wt"]=>int(889)["mu"]=>int(61200)["pmu"]=>int(25216)}
}
相关文章:
使用XHProf查找PHP性能瓶颈
使用XHProf查找PHP性能瓶颈 XHProf是facebook 开发的一个测试php性能的扩展,本文记录了在PHP应用中使用XHProf对PHP进行性能优化,查找性能瓶颈的方法。 下载 网上很多是编译安装xhprof-0.9.4版本,应该是用php5,在php8.0下编译x…...
矩阵论(Matrix)
大纲 矩阵微积分:多元微积分的一种特殊表达,尤其是在矩阵空间上进行讨论的时候逆矩阵(inverse matrix)矩阵分解:特征分解(Eigendecomposition),又称谱分解(Spectral decomposition…...
解决Emmy Lua插件在IDEA或 Reder 没有代码提示的问题(设置文件关联 增加对.lua.txt文件的支持)
目录 Reder版本2019.x Reder版本2021.1.5x Reder版本2019.x 解决Emmy Lua插件在IDEA或 Reder 没有代码提示的问题(设置文件关联 增加对.lua.txt文件的支持) Reder版本2021.1.5x 解决Emmy Lua插件在IDEA或 Reder 没有代码提示的问题(设置文件关联 增加对.lua.txt文件的支持)…...
macos端文件夹快速访问工具 Default Folder X 最新for mac
Default Folder X 是一款实用的工具,提供了许多增强功能和快捷方式,使用户能够更高效地浏览和管理文件。它的快速导航、增强的文件对话框、自定义设置和快捷键等功能,可以大大提升用户的工作效率和文件管理体验。 快速导航和访问:…...
树形 DP:树的直径
leetCode 104.二叉树的最大深度104. 二叉树的最大深度 - 力扣(LeetCode) class Solution { public:int maxDepth(TreeNode* root) {if(root nullptr) return 0;int lDepth maxDepth(root->left);int rDepth maxDepth(root->right);return max(l…...
【Python百宝箱】第三维度的魔法:探索Python游戏世界
Python在游戏开发中的魔力 前言 游戏开发一直是计算机科学中最引人入胜和具有挑战性的领域之一。随着技术的不断进步,开发者们寻找着更快、更灵活的工具来实现他们的创意。在这个探索的过程中,Python以其简洁、易学和强大的特性成为了游戏开发的热门选…...
3ds Max 电脑配置建议 | 建模+渲染选专业显卡or游戏显卡?
使用3ds Max进行建模和渲染时,选择合适的电脑配置非常重要。比如在硬件选择上,究竟选购游戏显卡还是专业显卡呢?本文将为你详细介绍游戏显卡和专业显卡的区别,并提供配置建议,助你作出明智的决策。 &#…...
水淹七军(递归,又是递归)
北大2023级最强新生问我的,最后他的问题说是重写了一遍就解决了 乐死了,有的时候根本看不出源代码漏了哪里 我的思路是: 一个数组记录本次放水所经过的格子,经过的不再递归 一个数组记录地图上各地点的高度 一个数组记录地图…...
Stable Video Diffusion重磅发布,快来看看哪些功能
本周,有关 OpenAI 宫斗的报道占据了Ai圈版面的主导地位,吃够了奥特曼的大瓜。我们来看看Stability AI刚发布的Stable Video Diffusion,这是一种通过对现有图像进行动画处理来生成视频的 AI 模型。基于 Stability 现有的Stable Diffusion文本到…...
城市NOA到来时刻,车企密集上车NVIDIA
作者 |张祥威 编辑 |德新 基于双NVIDIA DRIVE Orin实现城市NOA,已是今天国内汽车行业的主流做法。 这款芯片获得广泛的市场认同,用时仅一年多。去年3月, NVIDIA DRIVE Orin正式投产,此后从造车新势力一路来到更多自主品牌的车内&…...
Linux后台运行Python的py文件,如何使ssh工具退出后仍能运行
常规运行 python3 mysqlbak.py ssh工具退出后,或ctrlc中断后,程序将不在运行 后台运行 nohup python3 mysqlbak.py > mysqlbak.log & > mysqlbak.log为可选项,输出日志到指定文件,如果不写,输出日志到nohup…...
Excel中出现“#NAME?”怎么办?(文本原因)
excel 单元格出现 #NAME? 错误的原因有二: 函数公式输入不对导致 #NAME? 错误。 在单元格中字符串的前面加了号,如下图中的--GoJG7sEe6RqgTnlUcitA,本身我们想要的是--GoJG7sEe6RqgTnlUcitA,但因为某些不当的操作在前面加了号&…...
superset 后端增加注册接口
好烦啊-- :< 1.先定义modes: superset\superset\models\user.py # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information…...
利用 React 和 Bootstrap 进行强大的前端开发
文章目录 介绍React 和 Bootstrap设置环境使用 Bootstrap 创建 React 组件React-Bootstrap 组件结论 介绍 创建响应式、交互式和外观引人入胜的 Web 界面是现代前端开发人员的基本技能。幸运的是,借助 React 和 Bootstrap 等工具的出现,制作这些 UI 变得…...
深度学习之基于Pytorch照片图像转漫画风格网络系统
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 以下是一个基本的设计介绍: 数据准备:收集足够的真实照片和漫画图像,用于训练模…...
解决No Feign Client for loadBalancing defined,修改Maven依赖
Spring微服务报错: java.lang.IllegalStateException:FactoryBean threw exception on object creation; nested exception is java.lang.IllegalStateException: No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-netf…...
友思特分享 | Neuro-T:零代码自动深度学习训练平台
来源:友思特 智能感知 友思特分享 | Neuro-T:零代码自动深度学习训练平台 欢迎关注虹科,为您提供最新资讯! 工业自动化、智能化浪潮涌进,视觉技术在其中扮演了至关重要的角色。在汽车、制造业、医药、芯片、食品等行业…...
基于动量的梯度下降
丹尼尔林肯 (Daniel Lincoln)在Unsplash上拍摄的照片 一、说明 基于动量的梯度下降是一种梯度下降优化算法变体,它在更新规则中添加了动量项。动量项计算为过去梯度的移动平均值,过去梯度的权重由称为 Beta 的超参数控制。 这有助于解决与普通梯度下降相…...
ELK+kafka+filebeat企业内部日志分析系统
1、组件介绍 1、Elasticsearch: 是一个基于Lucene的搜索服务器。提供搜集、分析、存储数据三大功能。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布…...
MyBatis-Plus: 简化你的MyBatis应用
MyBatis-Plus: 简化你的MyBatis应用 在Java开发中,MyBatis一直是一个受欢迎的持久层框架,提供了灵活的数据访问方式。然而,MyBatis的使用往往涉及许多样板代码,这在一定程度上增加了开发的复杂性。这里,MyBatis-Plus&…...
终极免费屏幕标注工具ppInk:5分钟掌握Windows最强注释神器
终极免费屏幕标注工具ppInk:5分钟掌握Windows最强注释神器 【免费下载链接】ppInk Fork from Gink 项目地址: https://gitcode.com/gh_mirrors/pp/ppInk 你是否曾在在线会议、教学演示或产品展示中,因为找不到合适的屏幕标注工具而手忙脚乱&#…...
Sonoff Zigbee 3.0 USB Dongle Plus评测与智能家居应用
1. 项目概述:Sonoff Zigbee 3.0 USB Dongle Plus作为智能家居领域的硬件玩家,我最近测试了ITEAD新推出的Sonoff Zigbee 3.0 USB Dongle Plus(以下简称ZBDongle-P)。这款售价仅9.9美元的Zigbee协调器采用德州仪器CC2652P无线MCU芯片…...
02华夏之光永存:电磁弹射+一次性火箭航天入轨方案【第二篇:发射场优选选址全维度工程评估】
华夏之光永存:电磁弹射一次性火箭航天入轨方案【第二篇:发射场优选选址全维度工程评估】 核心备注:本文为该系列第二篇发射场选址评估篇,系列共计10篇保姆式开源落地白皮书,全文无玄学、纯工程勘测、地质、气象、土木规…...
别再用官方教程了!用Awesome-Backbones库5分钟搞定EfficientNetV2图像分类(附花卉数据集实战)
5分钟极速实战:用Awesome-Backbones解锁EfficientNetV2图像分类新姿势 当你第一次接触图像分类任务时,是否曾被PyTorch官方教程中复杂的代码结构和繁琐的配置步骤劝退?现在,一个名为Awesome-Backbones的开源库正在改变这一现状。这…...
Python之基础函数案例详解
函数的定义格式:12def 函数名():函数代码使用当前文件的函数我们直接定义一个函数然后运行程序, 函数并不会被调用12def hello():print(hello)想要函数被执行, 需要使用函数名来调用函数1234567# 定义函数def hello():print(hello)# 调用函数hello()需要注意的是, 在有些语言中…...
三甲医院信息科内部流出的VSCode医疗配置模板(含EMR集成预设、SNOMED CT语义补全、审计追踪开关),限时24小时解密
更多请点击: https://intelliparadigm.com 第一章:VSCode 医疗配置的核心价值与合规边界 在医疗信息系统开发与维护场景中,VSCode 不仅是轻量级编辑器,更是满足 HIPAA、GDPR 及《医疗器械软件注册审查指导原则》等合规要求的关键…...
网工_vs_运维|到底该选哪个?一篇讲清方向、技能与未来
网工 vs 运维|到底该选哪个?一篇讲清方向、技能与未来 不少刚入行、或是想转行 IT 的同学,都会卡在一个核心选择上:做网络工程师(网工),还是运维工程师? 两个岗位看似都是 “靠技术…...
终极解决方案:彻底消除drawio桌面版控制台输出污染父进程终端的实战指南
终极解决方案:彻底消除drawio桌面版控制台输出污染父进程终端的实战指南 【免费下载链接】drawio-desktop Official electron build of draw.io 项目地址: https://gitcode.com/GitHub_Trending/dr/drawio-desktop draw.io桌面版是一款功能强大的图表绘制工具…...
在RK3588开发板上,用TVM调用Mali-G610 GPU跑ONNX模型,实测性能提升多少?
在RK3588开发板上用TVM调用Mali-G610 GPU跑ONNX模型的性能实测 RK3588作为一款高性能嵌入式处理器,其集成的Mali-G610 GPU为AI推理提供了硬件加速能力。本文将带您完成从环境搭建到性能对比的全流程实测,用数据揭示GPU加速的真实效果。 1. 测试环境搭建…...
C语言内存漏洞TOP5正在被AI自动利用!2026规范新增3层防御机制(含编译器插桩+运行时沙箱)
更多请点击: https://intelliparadigm.com 第一章:现代 C 语言内存安全编码规范 2026 报错解决方法 随着 C23 标准落地及静态分析工具(如 Clang Static Analyzer、GCC 14 -fanalyzer 和 Microsoft SAL2)对内存安全的强化校验&…...
