オフラインになるSOドキュメントのベータ版から私の参照をクロスポストします。
XDebugによるプロファイリング
Xdebugと呼ばれるPHPの拡張機能は、PHPアプリケーションのプロファイリングやランタイムデバッグを支援するために利用できます。プロファイラーを実行すると、出力は「cachegrind」と呼ばれるバイナリ形式でファイルに書き込まれます。これらのファイルを分析するためのアプリケーションが各プラットフォームで利用可能です。 このプロファイリングを実行するためにアプリケーションコードを変更する必要はありません。
プロファイリングを有効にするには、拡張機能をインストールし、php.ini設定を調整します。一部のLinuxディストリビューションには、標準パッケージ(Ubuntuのphp-xdebug
パッケージなど)が付属しています。この例では、要求パラメーターに基づいてオプションでプロファイルを実行します。これにより、設定を静的に保ち、必要な場合にのみプロファイラーをオンにすることができます。
# php.ini settings
# Set to 1 to turn it on for every request
xdebug.profiler_enable = 0
# Let's use a GET/POST parameter to turn on the profiler
xdebug.profiler_enable_trigger = 1
# The GET/POST value we will pass; empty for any value
xdebug.profiler_enable_trigger_value = ""
# Output cachegrind files to /tmp so our system cleans them up later
xdebug.profiler_output_dir = "/tmp"
xdebug.profiler_output_name = "cachegrind.out.%p"
次に、ウェブクライアントを使用して、プロファイリングするアプリケーションのURLにリクエストを送信します。
http://example.com/article/1?XDEBUG_PROFILE=1
ページが処理されると、次のような名前のファイルに書き込まれます
/tmp/cachegrind.out.12345
デフォルトでは、ファイル名の番号はそれを書き込んだプロセスIDです。これは設定で構成可能xdebug.profiler_output_name
です。
実行されるPHPリクエスト/プロセスごとに1つのファイルを書き込むことに注意してください。したがって、たとえば、フォームの投稿を分析したい場合、GETリクエストがHTMLフォームを表示するためのプロファイルが1つ書き込まれます。XDEBUG_PROFILEパラメータを後続のPOSTリクエストに渡して、フォームを処理する2番目のリクエストを分析する必要があります。したがって、プロファイリングの際に、curlを実行してフォームを直接POSTする方が簡単な場合があります。
出力の分析
いったん書き込まれると、プロファイルキャッシュはKCachegrindやWebgrindなどのアプリケーションで読み取ることができます。人気のあるPHP IDEであるPHPStormも、このプロファイリングデータを表示できます。
たとえば、KCachegrindは次のような情報を表示します。
- 実行される機能
- それ自体と後続の関数呼び出しを含む呼び出し時間
- 各関数が呼び出された回数
- コールグラフ
- ソースコードへのリンク
何を探すべきか
明らかに、パフォーマンスの調整は、各アプリケーションの使用例に非常に固有です。一般的には、次のことを探すのが良いでしょう。
- 予期しない同じ関数への繰り返しの呼び出し。データを処理および照会する関数の場合、これらはアプリケーションがキャッシュする主要な機会になる可能性があります。
- 実行が遅い関数。アプリケーションはほとんどの時間をどこで費やしていますか?パフォーマンスチューニングで最も効果的なのは、アプリケーションの中で最も時間を消費する部分に焦点を当てることです。
注:Xdebug、特にそのプロファイリング機能は非常に多くのリソースを消費し、PHPの実行を遅くします。これらを運用サーバー環境で実行しないことをお勧めします。