一、安装配置
  1、下载PHP的XDebug扩展,网址:http://xdebug.org/

  2、在Linux下编译安装XDebug

引用
tar -xzf xdebug-2.0.0RC3.gz
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所在位置。

引用
vi /usr/local/php/lib/php.ini

  修改php.ini,去除PHP加速模块,增加以下配置信息支持XDebug扩展

  1. [Xdebug]
  2. zend_extension_ts="/usr/local/php/lib/php/extensions/no-debug-non-zts-20020429/xdebug.so"
  3. xdebug.profiler_enable=on
  4. xdebug.trace_output_dir="/tmp/xdebug"
  5. xdebug.profiler_output_dir="/tmp/xdebug"
  6. xdebug.profiler_output_name="script"
  1. [Xdebug]
  2. zend_extension_ts="/usr/local/php/lib/php/extensions/no-debug-non-zts-20020429/xdebug.so"
  3. xdebug.profiler_enable=on
  4. xdebug.trace_output_dir="/tmp/xdebug"
  5. xdebug.profiler_output_dir="/tmp/xdebug"
  6. xdebug.profiler_output_name="script"
  1. [Xdebug]
  2. zend_extension_ts="/usr/local/php/lib/php/extensions/no-debug-non-zts-20020429/xdebug.so"
  3. xdebug.profiler_enable=on
  4. xdebug.trace_output_dir="/tmp/xdebug"
  5. xdebug.profiler_output_dir="/tmp/xdebug"
  6. xdebug.profiler_output_name="script"
引用
mkdir -p /tmp/xdebug
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函数的内容如下:

  1. function getForbiddenTags()
  2. {
  3. $tagsPath=TEMPLATE_FILE_PATH."tags/forbidden_tags.txt";
  4. if(file_exists($tagsPath))
  5. {
  6. $fp = fopen($tagsPath, "r");
  7. $arrconf = array ();
  8. if ($fp)
  9. {
  10. while (!feof($fp))
  11. {
  12. $line = fgets($fp, 1024);
  13. $line = trim($line);
  14. $rows = explode("#", $line);
  15. $coumns = explode("=", trim($rows[0]));
  16. if(""!=trim($coumns[0]))
  17. {
  18. $arrconf[trim($coumns[0])] = trim($coumns[1]);
  19. }
  20. }
  21. }
  22. return $arrconf;
  23. }
  24. }
  1. function getForbiddenTags()
  2. {
  3. $tagsPath=TEMPLATE_FILE_PATH."tags/forbidden_tags.txt";
  4. if(file_exists($tagsPath))
  5. {
  6. $fp = fopen($tagsPath, "r");
  7. $arrconf = array ();
  8. if ($fp)
  9. {
  10. while (!feof($fp))
  11. {
  12. $line = fgets($fp, 1024);
  13. $line = trim($line);
  14. $rows = explode("#", $line);
  15. $coumns = explode("=", trim($rows[0]));
  16. if(""!=trim($coumns[0]))
  17. {
  18. $arrconf[trim($coumns[0])] = trim($coumns[1]);
  19. }
  20. }
  21. }
  22. return $arrconf;
  23. }
  24. }
  1. function getForbiddenTags()
  2. {
  3. $tagsPath=TEMPLATE_FILE_PATH."tags/forbidden_tags.txt";
  4. if(file_exists($tagsPath))
  5. {
  6. $fp = fopen($tagsPath, "r");
  7. $arrconf = array ();
  8. if ($fp)
  9. {
  10. while (!feof($fp))
  11. {
  12. $line = fgets($fp, 1024);
  13. $line = trim($line);
  14. $rows = explode("#", $line);
  15. $coumns = explode("=", trim($rows[0]));
  16. if(""!=trim($coumns[0]))
  17. {
  18. $arrconf[trim($coumns[0])] = trim($coumns[1]);
  19. }
  20. }
  21. }
  22. return $arrconf;
  23. }
  24. }

  (4)对getForbiddenTags函数进行分析,其中的PHP函数trim被调用了16827次。
  

  (5)可能造成瓶颈的原因:
  要过滤的156个关键字逐行存放在/usr/local/apache/template/tags/forbidden_tags.txt文件中,文本数据库的效率不高。
  逐行读取函数fgets、以及去除字符串两边的空白或者指定的字符的函数trim在高负载下的效率低,可以测试fopen、fread、fscanf之类的文件读取函数,对比一下。

大型网站调试工具之一(php性能优化分析工具XDebug)的更多相关文章

  1. golang 性能优化分析:benchmark 结合 pprof

    前面 2 篇 golang 性能优化分析系列文章: golang 性能优化分析工具 pprof (上) golang 性能优化分析工具 pprof (下) 一.基准测试 benchmark 简介 在 ...

  2. Android 性能优化之工具和优化点总结

    Android性能优化学习 最近公司主抓性能优化工作,借此春风也学习到了许多Android性能优化方面的知识.由于组内队友的给力,优化的成果也是比较喜人.同时也学习和实践了不少知识,特此记录. 1.性 ...

  3. SQL SERVER 查询性能优化——分析事务与锁(五)

    SQL SERVER 查询性能优化——分析事务与锁(一) SQL SERVER 查询性能优化——分析事务与锁(二) SQL SERVER 查询性能优化——分析事务与锁(三) 上接SQL SERVER ...

  4. 一次 group by + order by 性能优化分析

    一次 group by + order by 性能优化分析 最近通过一个日志表做排行的时候发现特别卡,最后问题得到了解决,梳理一些索引和MySQL执行过程的经验,但是最后还是有5个谜题没解开,希望大家 ...

  5. Linux 性能优化排查工具

    下图1为 Linux 性能优化排查工具的总结 图1 诊断 CPU 工具 查看 CPU 核数 总核数 = 物理CPU个数 X 每颗物理CPU的核数 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU ...

  6. 针对特定网站scrapy爬虫的性能优化

    在使用scrapy爬虫做性能优化时,一定要根据不同网站的特点来进行优化,不要使用一种固定的模式去爬取一个网站,这个是真理,以下是对58同城的爬取优化策略: 一.先来分析一下影响scrapy性能的set ...

  7. 如何更有效使用 Rational AppScan 扫描大型网站,第 2 部分: 案例分析

    使用 AppScan 进行扫描 针对大型网站的扫描,我们按照戴明环 PDCA 的方法论来进行规划和讨论,建议 AppScan 使用步骤:计划(Plan).执行(Do).检查(check).分析(Ana ...

  8. ubifs性能优化分析

    本文通过分析ubifs的mount.read.write和commit流程,挖掘ubifs背后的设计决策和性能优化手段,并结合自身产品的特点,给出一些读写性能改进方案.   1.     ubifs  ...

  9. MySQL索引及性能优化分析

    一.SQL性能下降的原因 查询语句问题,各种连接.子查询 索引失效(单值索引.复合索引) 服务器调优及各个参数设置(缓冲.线程池等) 二.索引 排好序的快速查找数据结构 1. 索引分类 单值索引 一个 ...

随机推荐

  1. localStorage简析

    声明:引用自http://www.cnblogs.com/st-leslie/p/5617130.html 一.什么是localStorage.sessionStorage 在HTML5中,新加入了一 ...

  2. Vue学习(三):数据绑定语法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. fiddler抓包-简单易操作(二)

    Fiddler抓包简介 原理:fiddler是通过改写HTTP代理,客户端和服务器进行交互时,数据会从他那里通过,来监控和截取数据.我是这样理解的,如果不对,欢迎指正.如下图: 如果想要抓到数据包,首 ...

  4. Python全栈 MongoDB 数据库(概念、安装、创建数据)

    什么是关系型数据库?           是建立在关系数据库模型基础上的数据库,借助于集合代数等概念和方法来处理数据库中的数据,             同时也是一个被组织成一组拥有正式描述性的表格( ...

  5. 命令行编译 WPF

    在开发调试代码 WPF 时,经常需要在修改完成代码后,点击 Rebuild,然后到指定文件夹下点击打开对应的 .exe 验证程序是否正确, 可以通过以下命名实现修改程序后,点击一个 .bat 文件,直 ...

  6. 树莓派搭建 Hexo 博客(二)

    Hexo 一个开源的博客框架,本文记录了一下在树莓派上搭建 Hexo 博客的过程. 上一篇介绍了 Hexo 的配置,现在网站已经能在本地访问了,也能通过 hexo generate 命令生成静态界面 ...

  7. android仿QQ的SlideMenu

    这其实很简单就可以实现,只需要自定义一个View继承自HorizontalScrollView 1,新建一个项目,再新建一个MySlideMenu继承HorizontalScrollView publ ...

  8. java面向对象课程设计-数学表达式计算器

    项目简介 设计一个计算器,其能够: 1)由用户输入一个简单的四则运算表达式,求出其计算结果后显示. 2)特殊数学函数,如:绝对值.取整.三角函数.倒数.平方根.平方.立方等. 3)对一定范围内的数字将 ...

  9. ps aux 和ps -aux和 ps -ef的选择

    转载自:足至迹留 Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想 ...

  10. javaScript this 之谜

    作为接触js没多久的人对变量作用域和this所指表示非常迷惑,专门花了一个下午google了一下,感觉以前百度到的结果都是什么鬼... 下面是我对this的认识,学疏才浅请拍砖 每一个方法都有自己的上 ...