xdebug を使用して PHP プログラムを分析し、パフォーマンスのボトルネックを見つける

伊谢尔伦
リリース: 2016-11-26 14:33:40
オリジナル
1964 人が閲覧しました

経済学には有名な 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

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 ファイルに 1 行ずつ保存されており、テキスト データベースは効率的ではありません。

行単位の読み取り関数 fgets や、文字列または指定された文字の両側の空白を削除する関数 Trim は、高負荷では非効率的です fopen、fread、fscanf などのファイル読み取り関数をテストして比較できます。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!