312

PHP スクリプトをプロファイリングする最も簡単な方法は何ですか?

すべての関数呼び出しのダンプとそれらにかかった時間を示す何かを追加したいのですが、特定の関数の周りに何かを配置しても問題ありません。

マイクロタイム機能を試してみました:

$then = microtime();
myFunc();
$now = microtime();

echo sprintf("Elapsed:  %f", $now-$then);

しかし、それは時々私に否定的な結果をもたらします。さらに、コード全体にそれを振りかけるのは大変です。

4

13 に答える 13

275

あなたはxdebugが欲しいと思います。サーバーにインストールして電源を入れ、kcachegrind (Linux の場合) またはwincachegrind (Windows の場合) を介して出力をポンピングすると、正確なタイミング、カウント、およびメモリ使用量の詳細を示すいくつかのきれいなグラフが表示されます (ただし、そのためには別の拡張機能が必要です)。

それは真剣に揺れます:D

于 2008-08-21T20:46:41.690 に答える
109

拡張機能は必要ありません。単純なプロファイリングにこれら 2 つの関数を使用するだけです。

// Call this at each point of interest, passing a descriptive string
function prof_flag($str)
{
    global $prof_timing, $prof_names;
    $prof_timing[] = microtime(true);
    $prof_names[] = $str;
}

// Call this when you're done and want to see the results
function prof_print()
{
    global $prof_timing, $prof_names;
    $size = count($prof_timing);
    for($i=0;$i<$size - 1; $i++)
    {
        echo "<b>{$prof_names[$i]}</b><br>";
        echo sprintf("&nbsp;&nbsp;&nbsp;%f<br>", $prof_timing[$i+1]-$prof_timing[$i]);
    }
    echo "<b>{$prof_names[$size-1]}</b><br>";
}

これは、各チェックポイントで説明を指定して prof_flag() を呼び出し、最後に prof_print() を呼び出す例です。

prof_flag("Start");

   include '../lib/database.php';
   include '../lib/helper_func.php';

prof_flag("Connect to DB");

   connect_to_db();

prof_flag("Perform query");

   // Get all the data

   $select_query = "SELECT * FROM data_table";
   $result = mysql_query($select_query);

prof_flag("Retrieve data");

   $rows = array();
   $found_data=false;
   while($r = mysql_fetch_assoc($result))
   {
       $found_data=true;
       $rows[] = $r;
   }

prof_flag("Close DB");

   mysql_close();   //close database connection

prof_flag("Done");
prof_print();

出力は次のようになります。

開始
   0.004303
DB に接続
   0.003518
クエリ
を実行   0.000308
データ
を取得   0.000009
DB を閉じる
   0.000049
完了

于 2015-03-12T23:43:31.273 に答える
107

PECL APD拡張機能は次のように使用されます。

<?php
apd_set_pprof_trace();

//rest of the script
?>

その後、 を使用して生成されたファイルを解析しますpprofp

出力例:

Trace for /home/dan/testapd.php
Total Elapsed Time = 0.00
Total System Time  = 0.00
Total User Time    = 0.00


Real         User        System             secs/    cumm
%Time (excl/cumm)  (excl/cumm)  (excl/cumm) Calls    call    s/call  Memory Usage Name
--------------------------------------------------------------------------------------
100.0 0.00 0.00  0.00 0.00  0.00 0.00     1  0.0000   0.0009            0 main
56.9 0.00 0.00  0.00 0.00  0.00 0.00     1  0.0005   0.0005            0 apd_set_pprof_trace
28.0 0.00 0.00  0.00 0.00  0.00 0.00    10  0.0000   0.0000            0 preg_replace
14.3 0.00 0.00  0.00 0.00  0.00 0.00    10  0.0000   0.0000            0 str_replace

警告: APD の最新リリースの日付は 2004 年で、拡張機能はメンテナンスされておらず、さまざまな互換性の問題があります (コメントを参照)。

于 2008-08-21T21:04:17.157 に答える
25

マイクロタイムを減算すると負の結果が得られる場合は、引数true( microtime(true)) を指定して関数を使用してみてください。を使用trueすると、関数は文字列ではなく浮動小数点数を返します (引数なしで呼び出された場合と同様)。

于 2012-01-10T16:47:32.997 に答える
25

正直なところ、プロファイリングには NewRelic を使用するのが最善であると主張します。

これは、ランタイムをまったく遅くしないように見える PHP 拡張機能であり、監視を行い、適切なドリルダウンを可能にします。高価なバージョンでは、大規模なドリルダウンが可能です (ただし、価格モデルを購入する余裕はありません)。

それでも、無料/標準プランを使用しても、簡単に達成できることのほとんどがどこにあるのかは明らかで単純です. また、DB の相互作用についても理解できる点も気に入っています。

プロファイリング時のインターフェイスの 1 つのスクリーンショット

于 2013-12-19T02:05:48.527 に答える
13

PECL XHPROFも面白そうです。レポートと非常に簡単なドキュメントを表示するためのクリック可能な HTML インターフェイスがあります。私はまだそれをテストする必要があります。

于 2011-06-23T11:26:12.677 に答える
10

プロファイリングには phpDebug を使用するのが好きです。 http://phpdebug.sourceforge.net/www/index.html

使用されているすべての SQL と含まれているすべてのファイルのすべての時間/メモリ使用量を出力します。明らかに、抽象化されたコードで最もうまく機能します。

関数とクラスのプロファイリングにはmicrotime()+ get_memory_usage()+を使用しますget_peak_memory_usage()

于 2008-08-21T20:45:03.363 に答える
8

私は断固としてBlackFireを試してみます。

puphpetを使用してまとめたこの virtualBox があり、BlackFire と通信するさまざまな php フレームワークをテストします。必要に応じて、自由にフォークおよび/または配布してください :)

https://github.com/webit4me/PHPFrameworks

于 2015-09-29T21:04:20.683 に答える
6

あなたの例のように、ベンチマークにはpear Benchmarkパッケージを使用します。測定用のマーカーを設定します。このクラスは、いくつかのプレゼンテーション ヘルパーも提供します。または、必要に応じてデータを処理することもできます。

私は実際に __destruct メソッドを使用して別のクラスにラップしています。スクリプトが終了すると、出力は log4php を介して syslog に記録されるため、多くのパフォーマンス データから作業できます。

于 2008-08-22T15:43:20.133 に答える