経済学には有名な 80-20 の法則があり、プログラミングでも引用されています。パフォーマンスのボトルネックの 80% はコードの 20% によって引き起こされます。 PHP の XDebug 拡張機能を利用すると、コードの 20% を効果的に見つけることができます。
1. インストールと構成
1. PHP 用の 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/
II、分析プロセス
1. Web サイトにアクセスし、ホームページ上のさまざまなリンクを数回クリックします。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
3. 分析結果:
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 関数の内容は次のとおりです。
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 回呼び出されたことがわかります。
(4) ボトルネックの考えられる理由:
フィルタリングされる 156 個のキーワードは /usr/local/apache/template/tags/forbidden_tags.txt ファイルに 1 行ずつ保存されており、テキスト データベースは効率的ではありません。
行単位の読み取り関数 fgets や、文字列または指定された文字の両側の空白を削除する関数 Trim は、高負荷では非効率的です fopen、fread、fscanf などのファイル読み取り関数をテストして比較できます。