1. 云栖社区>
  2. PHP教程>
  3. 正文

利用XDebug分析PHP程序,找出性能瓶颈

作者:用户 来源:互联网 时间:2017-12-01 18:16:20

程序

利用XDebug分析PHP程序,找出性能瓶颈 - 摘要: 本文讲的是利用XDebug分析PHP程序,找出性能瓶颈,经济学中有一条著名的80-20定律,引用到编程中,就是:80%的性能瓶颈是由20%的代码引起的。借助PHP的XDebug扩展,可以有效地找出这20%的代码。一、安装配置1、下载PHP的XDebug扩展,网址:http://xdebug.or

经济学中有一条著名的80-20定律,引用到编程中,就是:80%的性能瓶颈是由20%的代码引起的。借助PHP的XDebug扩展,可以有效地找出这20%的代码。


一、安装配置

1、下载PHP的XDebug扩展,网址:http://xdebug.org/
2、在Linux下编译安装XDebug

tar -xzf xdebug-2.0.0RC3.gzcd xdebug-2.0.0RC3/usr/local/php/bin/phpize./configure --enable-xdebugcp 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=onxdebug.trace_output_dir="/tmp/xdebug"xdebug.profiler_output_dir="/tmp/xdebug"xdebug.profiler_output_name="script"mkdir -p /tmp/xdebugchmod 755 /tmp/xdebugchown 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.outusr_local_apache_htdocs_app_login_showHeaderLogin_php_cachegrind.outusr_local_apache_htdocs_app_play_play_php_cachegrind.outusr_local_apache_htdocs_app_user_member_php_cachegrind.outusr_local_apache_htdocs_tag_tags_php_cachegrind.outusr_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

利用XDebug分析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;    }}


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

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

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索程序 ,以便于您获取更多的相关知识。

弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率

40+云计算产品,6个月免费体验

稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一

云服务器9.9元/月,大学必备