xhprofおよびFirePHPを使用したPHPアプリケーションのプロファイリングとデバッグ


すべてのWeb開発者、特に高負荷プロジェクトでは、遅かれ早かれ、アプリケーションのプロファイリングに対処する必要があります。 もちろん、サーバー側をデバッグできるxdebugを知っています。 ただし、重いRIAアプリケーションでは、多くの場合、フロントエンド+バックエンドの束、あらゆる種類のAjaxリクエスト、特定のスクリプトの処理速度、およびすべてのジャズでデバッグする必要があります。 これらのタスクには、非常に優れたツールセットがあります。 これはxhprofとfirephpです。

クイックリファレンス


xhprofは、facebookのphp拡張です。 これは、各関数の実行時間、メモリ使用量、待ち時間、呼び出し数などの統計を収集できる階層型プロファイラーです。 この拡張機能は、PECLリポジトリhttp://pecl.php.net/package/xhprofから入手できます。 こちらのドキュメントをご覧ください: http : //php.net/xhprof

FirePHPはfirebugの拡張機能であり、小さなphpクラスと連携して、たとえば、あらゆる種類のvar_dumpやその他のデバッグ情報など、phpからfirebugコンソールにデータを変換できます。 この拡張機能の主な利点は、デバッグ情報のすべての変換がヘッダーを介して行われ、ページを散らかしたり、アプリケーションのロジックを壊したりしないことです。 公式ウェブサイト: http : //firephp.org/


主なアイデア。


一般的なプロファイリングアルゴリズムは次のとおりです。
  1. ページの上部で、xhprof_enable()を使用してプロファイリングを有効にします
  2. ページの最後で、xhprof_disable()を使用してプロファイリングをオフにし、save_run()を使用して収集したデータを保存します。
  3. 次に、phpクラスfirephpを使用して、プロファイリングデータへのリンクをクライアントパーツに渡します。
  4. firebugコンソールで、必要な情報を開きます
  5. 喜ぶ:)

もちろん、これらの関数をphpスクリプトに手動で追加するのは素晴らしいことです。 しかし、私はこの情報が開発中に常に手元にあり、同時に戦闘サーバーに到達しないことを望んでいます。 この問題を次のように解決します。

私たちのプロジェクトでは、最初のほとんどすべてのスクリプトで、作業ファイルがクラスローダー、関数の接続、およびその他の必要なものに接続されています。 したがって、プロファイリングを含めるため、このファイルに移動しました。 そして、デバッグモードをオン/オフできるようにするために、必要に応じて構成定数のチェックを追加し、これらのチェックをプロジェクトのビルド時に自動的に削除されるいくつかのメタタグでラップしました。 同じことは、プロファイリングをオフにし、firephpを使用してヘッダーに情報を書き込むことにも当てはまります。これらのタスクは、各phpスクリプトの最後に呼び出され、メタタグでラップされる1つの関数によって解決されます。 次のようになります。

// -

/** * */
define( "APPLICATION_ENV" , "dev" ); // dev - | pro -
/** */
define( "XHPROF_ROOT" , __DIR__ . '/ExtProcs/debug/xhprof-0.9.2' );

/***************************************************************************************
* ,
* DEV_START DEV_END - -,
***************************************************************************************/

//-- DEV_START
//-- debug
if (APPLICATION_ENV === 'dev' ) {
// firephp
require_once(__DIR__ . '/includes/ExtProcs/debug/firephp/FirePHP.class.php' );
//--
require_once (XHPROF_ROOT . '/xhprof_lib/utils/xhprof_lib.php' );
require_once (XHPROF_ROOT . '/xhprof_lib/utils/xhprof_runs.php' );
// .
// php.net/manual/ru/xhprof.constants.php
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
}
//-- DEV_END

//
// DEV_START DEV_END

/**
*
*/
function dev_boot_Down() {
if (APPLICATION_ENV === 'dev' ) {
// firephp
$firephp = FirePHP::getInstance( true );
//
$xhprof_data = xhprof_disable();
$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_testing" );
//
$link = "http://" . $_SERVER[ 'HTTP_HOST' ] . "/includes/ExtProcs/debug/xhprof-0.9.2/xhprof_html/index.php?run={$run_id}&source=xhprof_testing\n" ;
$firephp->info($link, 'profiling data' );
}
}

* This source code was highlighted with Source Code Highlighter .

ここではすべてが簡単なので、これらの拡張機能のインストールの詳細には触れません。 設定の一部についてのみ説明します。 Xhproofは、プロファイリングデータが保存されるフォルダーを示す1つの構成変数xhprof.output_dirのみを提供します。 したがって、phpスクリプトが実行されるユーザーディレクトリに、指定されたディレクトリへの書き込み権限があることを確認してください。 php.iniに次のように記述します。

[xhprof]
extension=xhprof.so
xhprof.output_dir="/var/tmp/xhprof"


また、ドットやGraphvizのようなものを配置して呼び出しグラフを描画することも悪くありません。 MacOS XでGraphvizを使用しています。


上記の手順を完了すると、ブラウザでいつでもスクリプトを開いてプロファイリングを見ることができました。


プロファイリングデータへのリンクをコピーして開くと、これに似たものが表示されます。 値を持つ列の数は、xhprof_enable()で指定されたフラグに依存します。


[View Full Callgraph]リンクをクリックすると、スクリプトの関数への呼び出しのグラフが表示されます。


まあ、それがおそらくすべてです。 誰かがウェブアプリケーションのデバッグとプロファイリングに独自のアプローチを持っている場合、喜んでお聞きします。

PS仲間のクリャポロフがこの不名誉に積極的に参加したことだけを付け加えます

UPD 1:PythonistにはFirePyのようなプロジェクトがありますが、推測するのは難しいですが、データをpythonからfirebugに変換できます。

Source: https://habr.com/ru/post/J145895/


All Articles