php性能优化分析工具XDebug 大型网站调试工具


Posted in PHP onMay 22, 2011

一、安装配置

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扩展

[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"

引用
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

php性能优化分析工具XDebug 大型网站调试工具

(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; 
} 
}

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

php性能优化分析工具XDebug 大型网站调试工具

(5)可能造成瓶颈的原因:

要过滤的156个关键字逐行存放在/usr/local/apache/template/tags/forbidden_tags.txt文件中,文本数据库的效率不高。

逐行读取函数fgets、以及去除字符串两边的空白或者指定的字符的函数trim在高负载下的效率低,可以测试fopen、fread、fscanf之类的文件读取函数,对比一下。

PHP 相关文章推荐
php写的简易聊天室代码
Jun 04 PHP
用PHP提取中英文词语以及数字的首字母的方法介绍
Apr 23 PHP
PHP设计模式之结构模式的深入解析
Jun 13 PHP
php中的boolean(布尔)类型详解
Oct 28 PHP
PHP获取本周第一天和最后一天示例代码
Feb 24 PHP
php实现的支持imagemagick及gd库两种处理的缩略图生成类
Sep 23 PHP
微信公众平台接口开发入门示例
Dec 24 PHP
php实现猴子选大王问题算法实例
Apr 20 PHP
Yii中创建自己的Widget实例
Jan 05 PHP
php封装json通信接口详解及实例
Mar 07 PHP
PHP使用xpath解析XML的方法详解
May 20 PHP
PHP的mysqli_sqlstate()函数讲解
Jan 23 PHP
Look And Say 序列php实现代码
May 22 #PHP
php利用cookie实现访问次数统计代码
May 19 #PHP
PHP操作mysql函数详解,mysql和php交互函数
May 19 #PHP
php异常:Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE  eval()'d code error
May 19 #PHP
php中全局变量global的使用演示代码
May 18 #PHP
一个PHP分页类的代码
May 18 #PHP
PHP sprintf()函数用例解析
May 18 #PHP
You might like
一个SQL管理员的web接口
2006/10/09 PHP
Yii入门教程之目录结构、入口文件及路由设置
2014/11/25 PHP
Joomla开启SEF的方法
2016/05/04 PHP
为Extjs加加速(javascript加速)
2010/08/19 Javascript
JQUBAR1.1 jQuery 柱状图插件发布
2010/11/28 Javascript
ie8 不支持new Date(2012-11-10)问题的解决方法
2013/07/31 Javascript
jquery实现瀑布流效果分享
2014/03/26 Javascript
使用原生JS实现弹出层特效
2014/12/22 Javascript
通过隐藏iframe实现无刷新上传文件操作
2016/03/16 Javascript
JS获取IE版本号与HTML设置IE文档模式的方法
2016/10/09 Javascript
jQuery给指定的table动态添加删除行的操作方法
2016/10/12 Javascript
js实现5秒倒计时重新发送短信功能
2017/02/05 Javascript
简单实现js倒计时功能
2017/02/13 Javascript
使用Math.max,Math.min获取数组中的最值实例
2017/04/25 Javascript
详解webpack + vue + node 打造单页面(入门篇)
2017/09/23 Javascript
Vue的watch和computed方法的使用及区别介绍
2018/09/06 Javascript
微信小程序开发注意指南和优化实践(小结)
2019/06/21 Javascript
vue项目中全局引入1个.scss文件的问题解决
2019/08/01 Javascript
原生javascript制作贪吃蛇小游戏的方法分析
2020/02/26 Javascript
vue瀑布流组件实现上拉加载更多
2020/03/10 Javascript
Vue移动端项目实现使用手机预览调试操作
2020/07/18 Javascript
JS代码简洁方式之函数方法详解
2020/07/28 Javascript
[02:27]2018DOTA2亚洲邀请赛赛前采访-OpTic
2018/04/03 DOTA
python使用smtplib模块通过gmail实现邮件发送的方法
2015/05/08 Python
Python编程实现双击更新所有已安装python模块的方法
2017/06/05 Python
PyQt5的安装配置过程,将ui文件转为py文件后显示窗口的实例
2019/06/19 Python
修改 CentOS 6.x 上默认Python的方法
2019/09/06 Python
Python通过Schema实现数据验证方式
2020/11/12 Python
多重CSS背景动画实现方法示例
2014/04/04 HTML / CSS
利用CSS3伪元素实现逐渐发光的方格边框
2017/05/07 HTML / CSS
职务说明书范文
2014/05/07 职场文书
2016年“12.3”国际残疾人日活动总结
2016/04/01 职场文书
扩展多台相同的Web服务器
2021/04/01 Servers
浅谈MySql整型索引和字符串索引失效或隐式转换问题
2021/11/20 MySQL
vue3引入highlight.js进行代码高亮的方法实例
2022/04/08 Vue.js
配置nginx负载均衡
2022/05/06 Servers