遅かれ早かれ、私たちはそれぞれレガシーコードとその最適化に直面します。 このような状況でのデバッガーとプロファイラーは、プログラマーにとって最高のアシスタントです。 Derick Rethans(Derick Rethans)のおかげでPHPを使用する人には、xDebugという優れたツールがあります。 RuNetにもxDebugに関する多くの情報があるので、この記事の議論は彼に関するものではありません。
PHPのプロファイラーの言及につまずいたので、すぐにxDebugについて考えました(Zendのプロプライエタリツールを長い間忘れていました)が、今回は間違っていました-XHProfについてお話します。
XHProf
このプロファイラーはFacebook用に特別に開発され、そのソースコードは2009年3月に公開されました。
インストールは迅速かつスムーズでした。
wget pecl.php.net/get/xhprof-0.9.2.tgz
tar xvf xhprof-0.9.2.tgz
cd xhprof-0.9.2/extension/
phpize
./configure && make && make install
cd /usr/local/etc/php.d/
vim xhprof.ini
cd /usr/local/
vim header.php
vim footer.php
vim etc/php.ini
/etc/init.d/php-fpm restart
cp vhost.conf.template prof.my.conf
sed -is/site/prof/ prof.my.conf
vim prof.my.conf
/etc/init.d/nginx restart
上記の設定を分析しましょう
xhprof.ini
[xhprof]
extension=/usr/local/lib/php/extensions/no-debug-non-zts-20090626/xhprof.so
xhprof.output_dir="/home/max/www/profile/"
php.iniに2行追加しましたが、その説明は以下で説明します
auto_prepend_file = /usr/local/header.php
auto_append_file = /usr/local/footer.php
prof.my.conf-Nginx構成が最も標準です。
server {
listen 80;
server_name prof.my;
charset utf8;
root /usr/local/src/xhprof-0.9.2/xhprof_html ;
location / {
index index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:12000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/src/xhprof-0.9.2/xhprof_html/$fastcgi_script_name;
include fastcgi_params;
}
}
/usr/local/src/xhprof-0.9.2/xhprof_htmlには、プロファイラーに対して適切なWEBGUIを作成するPHPソースがあります。
したがって、2つのメインファイルについて:
header.php
<?php
if(isset($_COOKIE['xhprof'])){
if (extension_loaded('xhprof')) {
include_once '/usr/local/src/xhprof-0.9.2/xhprof_lib/utils/xhprof_lib.php';
include_once '/usr/local/src/xhprof-0.9.2/xhprof_lib/utils/xhprof_runs.php';
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
}
}
footer.php
<?php
if(isset($_COOKIE['xhprof'])){
if (extension_loaded('xhprof')) {
$profiler_namespace = 'myapp'; // namespace for your application
$xhprof_data = xhprof_disable();
$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, $profiler_namespace);
// url to the XHProf UI libraries (change the host name and path)
$profiler_url = sprintf('http://prof.my/index.php?run=%s&source=%s', $run_id, $profiler_namespace);
echo <<<OUT
Profiler output
OUT;
}
}
ここで、Web経由でPHPスクリプトを起動し、左上隅にプロファイラー出力へのリンクを確認します-これがprof.myホストの作成目的です
注意してください-私はCOOKIE検証を使用しています! このチェックにより、プロダクションサーバーでプロファイラーを安全に使用できます(実際のデータと実際の負荷)。
プロファイラーのWebインターフェースには、各機能に関する情報が記載されたプレートが表示され、次の情報が報告されます。
- 各関数の呼び出し回数
- ウォールタイム、機能の実行に費やした時間(ソケット、ファイルシステムなどからの応答の待機を含む)。
- CPU時間、関数の実行に費やした時間(ソケット、ファイルシステムなどからの応答の待機を除く)。
- メモリ使用量
- ピークメモリ使用量
パラメータのいずれかでテーブルをソートすることが可能です
各機能に関する情報は、InclusiveとExclusiveの2つのタイプに分けられます。 Inclusiveには、子呼び出しで使用される番号が含まれますが、Exclusiveには含まれません。 また、関数の名前をクリックすると、その関数と、それが呼び出された関数と呼び出された関数に関する情報のみを表示する可能性もあります。
GraphVizがシステムにインストールされている場合、プロファイラーは呼び出しグラフを描画します。
PS伝統を破ることなく:これはハブに関する私の最初の投稿です
UPD:PHPに再投稿されました。