There is a famous 80-20 law in economics, which is quoted in programming: 80% of performance bottlenecks are caused by 20% of the code. With the help of PHP's XDebug extension, these 20% of code can be effectively found.
1. Installation and configuration
1. Download the XDebug extension for PHP at: http://xdebug.org/
2. Compile and install XDebug under Linux
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/
Note: /usr/local/php/lib/ php/extensions/no-debug-non-zts-20020429/Different PHP versions have different paths and do not have to be placed on this path. You can specify the location of xdebug.so in zend_extension_ts.
vi /usr/local/php/lib/php.ini
Modify php.ini, remove the PHP acceleration module, and add the following configuration information to support XDebug extension
[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. Client (Windows): WinCacheGrind Download address: http://sourceforge.net/projects/wincachegrind/
II , Analysis process
1. Visit your website and click various links on the homepage several times. XDebug generates the following files in the /tmp/xdebug directory:
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. Copy the above files to Windows and use client software WinCacheGrind opened each file and found that the following PHP program took the longest time to execute:
/usr/local/apache/htdocs/tag/tags.php 耗时840ms
3. Analysis results:
1, /usr/local/apache/htdocs/tag/tags.php
( 1) The longest time-consuming filter_tags function appears on line 158 of /usr/local/apache/htdocs/tag/tags.php:
$tags .= filter_tags($videos[$i]['tags'])." ";
(2) The filter_tags function is quoted from /usr/local/apache/htdocs/include /misc.php, the getForbiddenTags function is called 21 times by the filter_tags function. Most of the time spent by the filter_tags function is caused by the getForbiddenTags function. The content of the getForbiddenTags function is as follows:
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) Analysis of the getForbiddenTags function shows that the PHP function trim was called 16827 times.
(4) Possible reasons for the bottleneck:
The 156 keywords to be filtered are stored line by line in the /usr/local/apache/template/tags/forbidden_tags.txt file, and the text database is not efficient .
The line-by-line reading function fgets and the function trim that removes blanks on both sides of a string or specified characters are inefficient under high load. You can test file reading functions such as fopen, fread, and fscanf for comparison.