大型网站调试工具之一(php性能优化分析工具XDebug)
一、安装配置
1、下载PHP的XDebug扩展,网址:http://xdebug.org/
2、在Linux下编译安装XDebug
cd xdebug-2.0.0RC3
/usr/local/php/bin/phpize
./configure --enable-xdebug
cp modules/xdebug.so /usr/local/php/lib/php/extensions/no-debug-non-zts-20020429/
注:/usr/local/php/lib/php/extensions/no-debug-non-zts-20020429/不同的PHP版本路径不同,也不一定要放在该路径,可以在zend_extension_ts中自行指定xdebug.so所在位置。
修改php.ini,去除PHP加速模块,增加以下配置信息支持XDebug扩展
- [Xdebug]
- zend_extension_ts="/usr/local/php/lib/php/extensions/no-debug-non-zts-20020429/xdebug.so"
- xdebug.profiler_enable=on
- xdebug.trace_output_dir="/tmp/xdebug"
- xdebug.profiler_output_dir="/tmp/xdebug"
- xdebug.profiler_output_name="script"
- [Xdebug]
- zend_extension_ts="/usr/local/php/lib/php/extensions/no-debug-non-zts-20020429/xdebug.so"
- xdebug.profiler_enable=on
- xdebug.trace_output_dir="/tmp/xdebug"
- xdebug.profiler_output_dir="/tmp/xdebug"
- xdebug.profiler_output_name="script"
- [Xdebug]
- zend_extension_ts="/usr/local/php/lib/php/extensions/no-debug-non-zts-20020429/xdebug.so"
- xdebug.profiler_enable=on
- xdebug.trace_output_dir="/tmp/xdebug"
- xdebug.profiler_output_dir="/tmp/xdebug"
- xdebug.profiler_output_name="script"
chmod 755 /tmp/xdebug
chown www:www /tmp/xdebug
/usr/local/apache/bin/apachectl -k restart
3、客户端(Windows):WinCacheGrind
下载地址:http://sourceforge.net/projects/wincachegrind/
二、分析过程
1、访问你的网站,将首页上各种链接点击几遍,XDebug在/tmp/xdebug目录生成以下文件:
usr_local_apache_htdocs_app_checknum_chknum_php_cachegrind.out
usr_local_apache_htdocs_app_login_showHeaderLogin_php_cachegrind.out
usr_local_apache_htdocs_app_play_play_php_cachegrind.out
usr_local_apache_htdocs_app_user_member_php_cachegrind.out
usr_local_apache_htdocs_tag_tags_php_cachegrind.out
usr_local_apache_htdocs_top_top_php_cachegrind.out
2、将以上文件拷贝到Windows上,用客户端软件WinCacheGrind打开每个文件,发现以下PHP程序执行所耗费的时间最长:
/usr/local/apache/htdocs/tag/tags.php 耗时840ms
三、分析结果:
1、/usr/local/apache/htdocs/tag/tags.php
(1)耗时最长的filter_tags函数出现在/usr/local/apache/htdocs/tag/tags.php的第158行:
$tags .= filter_tags($videos[$i]['tags'])." ";
(2)filter_tags函数引自/usr/local/apache/htdocs/include /misc.php,getForbiddenTags函数被filter_tags函数调用了21次,filter_tags函数耗费的时间中绝大多数 因getForbiddenTags函数所致。getForbiddenTags函数的内容如下:
- function getForbiddenTags()
- {
- $tagsPath=TEMPLATE_FILE_PATH."tags/forbidden_tags.txt";
- if(file_exists($tagsPath))
- {
- $fp = fopen($tagsPath, "r");
- $arrconf = array ();
- if ($fp)
- {
- while (!feof($fp))
- {
- $line = fgets($fp, 1024);
- $line = trim($line);
- $rows = explode("#", $line);
- $coumns = explode("=", trim($rows[0]));
- if(""!=trim($coumns[0]))
- {
- $arrconf[trim($coumns[0])] = trim($coumns[1]);
- }
- }
- }
- return $arrconf;
- }
- }
- function getForbiddenTags()
- {
- $tagsPath=TEMPLATE_FILE_PATH."tags/forbidden_tags.txt";
- if(file_exists($tagsPath))
- {
- $fp = fopen($tagsPath, "r");
- $arrconf = array ();
- if ($fp)
- {
- while (!feof($fp))
- {
- $line = fgets($fp, 1024);
- $line = trim($line);
- $rows = explode("#", $line);
- $coumns = explode("=", trim($rows[0]));
- if(""!=trim($coumns[0]))
- {
- $arrconf[trim($coumns[0])] = trim($coumns[1]);
- }
- }
- }
- return $arrconf;
- }
- }
- function getForbiddenTags()
- {
- $tagsPath=TEMPLATE_FILE_PATH."tags/forbidden_tags.txt";
- if(file_exists($tagsPath))
- {
- $fp = fopen($tagsPath, "r");
- $arrconf = array ();
- if ($fp)
- {
- while (!feof($fp))
- {
- $line = fgets($fp, 1024);
- $line = trim($line);
- $rows = explode("#", $line);
- $coumns = explode("=", trim($rows[0]));
- if(""!=trim($coumns[0]))
- {
- $arrconf[trim($coumns[0])] = trim($coumns[1]);
- }
- }
- }
- return $arrconf;
- }
- }
(4)对getForbiddenTags函数进行分析,其中的PHP函数trim被调用了16827次。
(5)可能造成瓶颈的原因:
要过滤的156个关键字逐行存放在/usr/local/apache/template/tags/forbidden_tags.txt文件中,文本数据库的效率不高。
逐行读取函数fgets、以及去除字符串两边的空白或者指定的字符的函数trim在高负载下的效率低,可以测试fopen、fread、fscanf之类的文件读取函数,对比一下。
大型网站调试工具之一(php性能优化分析工具XDebug)的更多相关文章
- golang 性能优化分析:benchmark 结合 pprof
前面 2 篇 golang 性能优化分析系列文章: golang 性能优化分析工具 pprof (上) golang 性能优化分析工具 pprof (下) 一.基准测试 benchmark 简介 在 ...
- Android 性能优化之工具和优化点总结
Android性能优化学习 最近公司主抓性能优化工作,借此春风也学习到了许多Android性能优化方面的知识.由于组内队友的给力,优化的成果也是比较喜人.同时也学习和实践了不少知识,特此记录. 1.性 ...
- SQL SERVER 查询性能优化——分析事务与锁(五)
SQL SERVER 查询性能优化——分析事务与锁(一) SQL SERVER 查询性能优化——分析事务与锁(二) SQL SERVER 查询性能优化——分析事务与锁(三) 上接SQL SERVER ...
- 一次 group by + order by 性能优化分析
一次 group by + order by 性能优化分析 最近通过一个日志表做排行的时候发现特别卡,最后问题得到了解决,梳理一些索引和MySQL执行过程的经验,但是最后还是有5个谜题没解开,希望大家 ...
- Linux 性能优化排查工具
下图1为 Linux 性能优化排查工具的总结 图1 诊断 CPU 工具 查看 CPU 核数 总核数 = 物理CPU个数 X 每颗物理CPU的核数 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU ...
- 针对特定网站scrapy爬虫的性能优化
在使用scrapy爬虫做性能优化时,一定要根据不同网站的特点来进行优化,不要使用一种固定的模式去爬取一个网站,这个是真理,以下是对58同城的爬取优化策略: 一.先来分析一下影响scrapy性能的set ...
- 如何更有效使用 Rational AppScan 扫描大型网站,第 2 部分: 案例分析
使用 AppScan 进行扫描 针对大型网站的扫描,我们按照戴明环 PDCA 的方法论来进行规划和讨论,建议 AppScan 使用步骤:计划(Plan).执行(Do).检查(check).分析(Ana ...
- ubifs性能优化分析
本文通过分析ubifs的mount.read.write和commit流程,挖掘ubifs背后的设计决策和性能优化手段,并结合自身产品的特点,给出一些读写性能改进方案. 1. ubifs ...
- MySQL索引及性能优化分析
一.SQL性能下降的原因 查询语句问题,各种连接.子查询 索引失效(单值索引.复合索引) 服务器调优及各个参数设置(缓冲.线程池等) 二.索引 排好序的快速查找数据结构 1. 索引分类 单值索引 一个 ...
随机推荐
- localStorage简析
声明:引用自http://www.cnblogs.com/st-leslie/p/5617130.html 一.什么是localStorage.sessionStorage 在HTML5中,新加入了一 ...
- Vue学习(三):数据绑定语法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- fiddler抓包-简单易操作(二)
Fiddler抓包简介 原理:fiddler是通过改写HTTP代理,客户端和服务器进行交互时,数据会从他那里通过,来监控和截取数据.我是这样理解的,如果不对,欢迎指正.如下图: 如果想要抓到数据包,首 ...
- Python全栈 MongoDB 数据库(概念、安装、创建数据)
什么是关系型数据库? 是建立在关系数据库模型基础上的数据库,借助于集合代数等概念和方法来处理数据库中的数据, 同时也是一个被组织成一组拥有正式描述性的表格( ...
- 命令行编译 WPF
在开发调试代码 WPF 时,经常需要在修改完成代码后,点击 Rebuild,然后到指定文件夹下点击打开对应的 .exe 验证程序是否正确, 可以通过以下命名实现修改程序后,点击一个 .bat 文件,直 ...
- 树莓派搭建 Hexo 博客(二)
Hexo 一个开源的博客框架,本文记录了一下在树莓派上搭建 Hexo 博客的过程. 上一篇介绍了 Hexo 的配置,现在网站已经能在本地访问了,也能通过 hexo generate 命令生成静态界面 ...
- android仿QQ的SlideMenu
这其实很简单就可以实现,只需要自定义一个View继承自HorizontalScrollView 1,新建一个项目,再新建一个MySlideMenu继承HorizontalScrollView publ ...
- java面向对象课程设计-数学表达式计算器
项目简介 设计一个计算器,其能够: 1)由用户输入一个简单的四则运算表达式,求出其计算结果后显示. 2)特殊数学函数,如:绝对值.取整.三角函数.倒数.平方根.平方.立方等. 3)对一定范围内的数字将 ...
- ps aux 和ps -aux和 ps -ef的选择
转载自:足至迹留 Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想 ...
- javaScript this 之谜
作为接触js没多久的人对变量作用域和this所指表示非常迷惑,专门花了一个下午google了一下,感觉以前百度到的结果都是什么鬼... 下面是我对this的认识,学疏才浅请拍砖 每一个方法都有自己的上 ...