<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[静怡家园]]></title> 
<link>http://www.zhanghaijun.com/index.php</link> 
<description><![CDATA[书山有路勤为径，学海无涯苦作舟！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[静怡家园]]></copyright>
<item>
<link>http://www.zhanghaijun.com/post//</link>
<title><![CDATA[利用Xdebug分析PHP程序，找出性能瓶颈]]></title> 
<author>碟舞飞扬 &lt;webmaster@zhanghaijun.com&gt;</author>
<category><![CDATA[Linux技术]]></category>
<pubDate>Tue, 17 May 2011 06:56:42 +0000</pubDate> 
<guid>http://www.zhanghaijun.com/post//</guid> 
<description>
<![CDATA[ 
	　　[文章作者：张宴 本文版本：v1.0 最后修改：2007.06.28 转载请注明出处：http://blog.s135.com]<br/><br/>　　经济学中有一条著名的80-20定律，引用到编程中，就是：80%的性能瓶颈是由20%的代码引起的。借助PHP的XDebug扩展，可以有效地找出这20%的代码。<br/><br/>　　一、安装配置<br/>　　1、下载PHP的XDebug扩展，网址：http://xdebug.org/<br/><br/>　　2、在Linux下编译安装XDebug<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">tar -xzf xdebug-2.0.0RC3.gz<br/>cd xdebug-2.0.0RC3<br/>/usr/local/php/bin/phpize<br/>./configure --enable-xdebug<br/>cp modules/xdebug.so /usr/local/php/lib/php/extensions/no-debug-non-zts-20020429/</div></div><br/>　　注：/usr/local/php/lib/php/extensions/no-debug-non-zts-20020429/不同的PHP版本路径不同，也不一定要放在该路径，可以在zend_extension_ts中自行指定xdebug.so所在位置。<br/>vi /usr/local/php/lib/php.ini<br/>修改php.ini，去除PHP加速模块，增加以下配置信息支持XDebug扩展<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">[Xdebug]&nbsp;&nbsp;<br/>zend_extension_ts="/usr/local/php/lib/php/extensions/no-debug-non-zts-20020429/xdebug.so"&nbsp;&nbsp;<br/>xdebug.profiler_enable=on&nbsp;&nbsp;<br/>xdebug.trace_output_dir="/tmp/xdebug"&nbsp;&nbsp;<br/>xdebug.profiler_output_dir="/tmp/xdebug"&nbsp;&nbsp;<br/>xdebug.profiler_output_name="script"&nbsp;&nbsp;<br/></div></div><br/>mkdir -p /tmp/xdebug<br/>chmod 755 /tmp/xdebug<br/>chown www:www /tmp/xdebug<br/>/usr/local/apache/bin/apachectl -k restart<br/><br/>　　3、客户端（Windows）：WinCacheGrind<br/>　　下载地址：http://sourceforge.net/projects/wincachegrind/<br/><br/>　　二、分析过程<br/>　　1、访问你的网站，将首页上各种链接点击几遍，XDebug在/tmp/xdebug目录生成以下文件：<br/>　　usr_local_apache_htdocs_app_checknum_chknum_php_cachegrind.out<br/>　　usr_local_apache_htdocs_app_login_showHeaderLogin_php_cachegrind.out<br/>　　usr_local_apache_htdocs_app_play_play_php_cachegrind.out<br/>　　usr_local_apache_htdocs_app_user_member_php_cachegrind.out<br/>　　usr_local_apache_htdocs_tag_tags_php_cachegrind.out<br/>　　usr_local_apache_htdocs_top_top_php_cachegrind.out<br/><br/>　　2、将以上文件拷贝到Windows上，用客户端软件WinCacheGrind打开每个文件，发现以下PHP程序执行所耗费的时间最长：<br/>　　/usr/local/apache/htdocs/tag/tags.php　　　　　　耗时840ms<br/><br/>　　三、分析结果：<br/>　　1、/usr/local/apache/htdocs/tag/tags.php<br/><a href="http://www.zhanghaijun.com/attachment.php?fid=23" target="_blank"><img src="http://www.zhanghaijun.com/attachment.php?fid=23" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>　　(1)耗时最长的filter_tags函数出现在/usr/local/apache/htdocs/tag/tags.php的第158行：<br/>　　$tags .= filter_tags($videos[$i]['tags'])." ";<br/><br/>　　(2)filter_tags函数引自/usr/local/apache/htdocs/include/misc.php，getForbiddenTags函数被filter_tags函数调用了21次，filter_tags函数耗费的时间中绝大多数因getForbiddenTags函数所致。getForbiddenTags函数的内容如下：<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">function getForbiddenTags()&nbsp;&nbsp;<br/>&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;$tagsPath=TEMPLATE_FILE_PATH."tags/forbidden_tags.txt";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if(file_exists($tagsPath))&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$fp = fopen($tagsPath, "r");&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$arrconf = array ();&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($fp)&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (!feof($fp))&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$line = fgets($fp, 1024);&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$line = trim($line);&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$rows = explode("#", $line);&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$coumns = explode("=", trim($rows[0]));&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(""!=trim($coumns[0]))&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$arrconf[trim($coumns[0])] = trim($coumns[1]);&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $arrconf;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&#125;</div></div>&nbsp;&nbsp;<br/>(4)对getForbiddenTags函数进行分析，其中的PHP函数trim被调用了16827次。<br/><a href="http://www.zhanghaijun.com/attachment.php?fid=24" target="_blank"><img src="http://www.zhanghaijun.com/attachment.php?fid=24" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>　　(5)可能造成瓶颈的原因：<br/>　　要过滤的156个关键字逐行存放在/usr/local/apache/template/tags/forbidden_tags.txt文件中，文本数据库的效率不高。<br/>　　逐行读取函数fgets、以及去除字符串两边的空白或者指定的字符的函数trim在高负载下的效率低，可以测试fopen、fread、fscanf之类的文件读取函数，对比一下。 <br/>Tags - <a href="http://www.zhanghaijun.com/tags/xdebug/" rel="tag">xdebug</a>
]]>
</description>
</item><item>
<link>http://www.zhanghaijun.com/post//#blogcomment</link>
<title><![CDATA[[评论] 利用Xdebug分析PHP程序，找出性能瓶颈]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.zhanghaijun.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>