PHP スクリプトの分析
はじめに
Xdebug アナライザーは、PHP コードを分析してボトルネックを特定したり、コードの実行が遅すぎてアクセラレータの使用が必要な箇所を特定したりする強力なアナライザーです。 Xdebug2 のアナライザー出力情報は、cachegrind 互換ファイルで表現されます。これにより、優れた KcacheGrind ツール (Linux、KDE) を使用してデータを分析できるようになります。 Linux を使用している場合は、インストール マネージャーでインストールできます。
Windows で使用できるプリコンパイル済みの QcacheGrind バイナリ インストール パッケージもあります (QCacheGrind は、KDE をバンドルしていない KcacheGrind のバージョンです)
Mac システムを使用している場合は、QcacheGrind をインストールする方法について説明します。
Windows ユーザーは WinCacheGrind の使用を選択することもできます。ただし、KcacheGrind とは機能が異なるため、この記事ではソフトウェアの紹介は行いません。 Xdebug2.3 が公開されたとき、WinCacheGrind は現在、cachegrind 圧縮関数とファイルをまだサポートしていませんでした。
KDE を使用しない (または使用したくない) 場合、kcachegrind パッケージには、トレース ファイルを分析して ASCII を出力できる Perl スクリプト「ct_annotate」も含まれています。
分析を開始
分析を有効にするには、Php.ini の xdebug.profiler_enable を 1 に設定します。このセットアップ コマンド xdebug はプロファイリングを有効にし、xdebug.profiler_output_dir で指定されたディレクトリに書き込みます。生成されるファイル名は通常、「cachegrind.out」で始まり、PHP (または Apache) プロセスの PID (プロセス ID)、または初期デバッグ スクリプトを含むディレクトリの crc32 ハッシュで終わります。 xdebug.profiler_output_dir 設定ディレクトリに、複雑なスクリプト分析によって生成される膨大な分析データを保存するのに十分なスペースがあることを確認してください。たとえば、500MB を超える複雑なアプリケーションである eZ Publish があります。
xdebug.profiler_enable_trigger を 1 に設定して、プロファイラーを手動で有効にすることもできます。 1 に設定すると、XDEBUG_PROFILE という名前の変数を使用して GET/POST または COOKIE 値を利用するようにプロファイラーに指示できます。 FireFox 2 拡張機能を使用すると、デバッガーを有効にすることができ (「HTTP デバッグ セッション」を参照)、この設定を使用することもできます。トリガーが適切に機能するには、xdebug.profiler_enable を 0 に設定する必要があります。
分析結果が生成されたら、KCacheGrind を使用してそれを開くことができます:
ファイルを開くと、KCacheGrind にさまざまなパネルが表示され、参照に十分な情報が提供されます。左側には、サブ関数の時間を含む、すべてのスクリプト関数が費やされた時間順にリストされる「フラット プロファイル」パネルが表示されます。 2 番目の列「Self」は関数 (サブ関数を除く) によって費やされた時間を示し、3 番目の列「Called」は呼び出される頻度を示し、最後の列「functions」は関数名を示します。 Xdebug は PHP の内部関数名を変更し、関数名にプレフィックス「php::」を追加します。また、参照されたファイルも指定された方法で処理されます。 include コマンドの呼び出しの後には、「::」と参照されるファイル名が続きます。左側のスクリーンショットでは、「include::/home/httpd/ez_34/v...」とメモリ関数の例「php」が表示されます。 ::mysql_query」。最初の 2 つの列の数値は、合計実行時間をパーセンテージ (例を参照) または絶対時間 (1 単位は 1/1,000,000 秒を表します) として表すことができます。右側のボタンを使用して、これら 2 つのモードを切り替えることができます。
右側のパネルには、上部パネルと下部パネルが含まれています。上のパネルには、現在選択されている関数を呼び出す関数が表示されます (スクリーンショットでは「eztemplatedesignresource->executecompiledtemplate」)。下のパネルには、選択した関数によって呼び出される関数のリストが表示されます。
上部パネルのコスト列には、現在選択されている関数がリストで呼び出されたときに費やされた時間が表示されます。 [コスト] 列の数値は通常 100% です。下部パネルのコスト列には、リスト内の関数の呼び出しに費やされた時間が表示されます。この列の数値の中には、実行時間が 100% に達する関数はありません。
「すべての呼び出し元」と「すべての呼び出し」は、それぞれ関数によって実行される直接の呼び出しだけでなく、関数のより上位と下位の関係も示します。スクリーンショットの上部パネルには、現在選択されている関数によって呼び出されるすべての関数の列が表示されており、スタックの中央には直接的および間接的に関連する他の関数も含まれています。 (翻訳能力には制限があります...元の文は次のとおりです。左側のスクリーンショットの上部ペインには、現在選択されている関数を直接および間接的に呼び出しているすべての関数が、スタック上のそれらの間にある他の関数とともに表示されます。) 「距離」列はリスト内の関数呼び出しの数を表し、現在の選択は (-1) です。 2 つの関数間の距離が異なる場合は、値の範囲も表示されます (例:「5-24」)。括弧内の数字は平均値を表します。下のパネルも同様に表示されますが、直接的または間接的に、現在選択されている関数によって呼び出されるすべての関数情報が表示される点が異なります。
関連設定
タイプ:
整数、デフォルト値: 0 1 に設定すると、新しいリクエストで分析ファイルが同じファイルにマップされるとき (xdebug.profiler_output_name に応じて)、分析結果は上書きされませんが、分析情報はフォームの最後に追加されます。新しい分析ファイル。
xdebug.profiler_enable
タイプ: 整数、デフォルト値: 0
Xdebug のアナライザーを開くと、プロファイル出力ディレクトリに分析ファイルを作成できます。これらのファイルを KcacheGrind で読み取って、データを視覚的に分析できます。この設定は、ini_set() を使用してスクリプトで設定することはできません。プロファイラを選択的に有効にする場合は、代わりに xdebug.profiler_enable_trigger 設定を 1 に設定します。
xdebug.profiler_enable_trigger
タイプ: 整数、デフォルト値: 0
1 に設定すると、XDEBUG_PROFILE の GET/POST パラメーターを使用するか、XDEBUG_RPOFILE の Cookie 値を設定して、分析ファイルの生成をトリガーできます。これらは、事前定義されたディレクトリにプロファイルを書き込みます。リクエストごとにプロファイル ファイルが生成されないようにするには、xdebug.profiler_enable の値を 0 に設定する必要があります。アクセス トリガーは、xdebug.profiler_enable_trigger_value を介して構成できます。
xdebug.profiler_enable_trigger_value
タイプ: 文字列、デフォルト値: ""、Xdebug > 2.3
以降xdebug.profiler_enable_trigger で説明されているように、この設定は XDEBUG_PROFILE 機能を利用できるユーザーを制限するために使用されます。元の空の文字列のデフォルト値から変更する場合、Cookie、GET、または POST パラメーターの値が共有秘密セットと一致し、設定とともにアナライザーを有効にする必要があります。
xdebug.profiler_output_dir
タイプ: 文字列、デフォルト値: /tmp
このディレクトリは分析ファイルが出力される場所です。PHP を実行しているアカウントにこのディレクトリへの書き込み権限があることを確認してください。この設定は、ini_set() を使用してスクリプトで設定することはできません。
xdebug.profiler_output_name
タイプ: 文字列、デフォルト値: cachegrind.out.%p
この設定は分析ファイルの名前を決定します。分析ファイルの名前は、sprintf() や strftime() と同様に形式識別子を使用して指定できます。ファイル名をフォーマットする識別子がいくつかあります。詳細については、xdebug.trace_output_name の説明を参照してください。
文字列 xdebug_get_profiler_filename()
現在保存されている解析情報のファイル名を返します。