30

これがSOでの最初の質問です。

最近維持を依頼された社内アプリケーションがあります。アプリケーションは PHP で構築されており、かなり適切にコーディングされています (OO、DB 抽象化、Smarty)。

問題は、アプリケーションが非常に遅いことです。

アプリケーションの速度低下の原因を突き止めるにはどうすればよいですか? DB クエリをほとんど作成しないようにコードを最適化したので、実行に時間がかかっているのは PHP コードであることがわかります。これに役立つツールをいくつか入手する必要があり、コードをチェックするための戦略を考案する必要があります。

私はチェック/戦略作業を自分で行うことができますが、アプリがどこで失敗しているかを把握するには、さらに PHP ツールが必要です。

考え?

4

12 に答える 12

40

最近、同様の状況でXDebug プロファイリングを使用しました。多くの一般的なプロファイリング アプリで読み取ることができる完全なプロファイル レポートを出力します (ただし、リストを提供することはできません。slackware に付属しているものを使用しました)。

于 2008-09-11T03:06:52.313 に答える
9

Juan が述べたように、xDebug は優れています。Windows を使用している場合は、WinCacheGrindでレポートを確認できます。

于 2008-09-11T14:58:28.687 に答える
6

Rasmus Lerdorf (PHP の作成者) によるこのプレゼンテーションをご覧ください。彼は、PHP の速度をテストするためのいくつかの良い例と、何を探すべきか、および物事を遅くする可能性のある内部構造について説明します。XDebug は、彼が使用するツールの 1 つです。彼はまた、フレームワークでどのようなパフォーマンス コストが発生するかを知ることについて、非常に堅実な指摘をしています。

ビデオ: http://www.archive.org/details/simple_is_hard

スライド(動画だと見にくいので): http ://talks.php.net/show/drupal08/1

于 2008-09-11T19:37:26.583 に答える
4

アプリケーションのパフォーマンスに影響を与える変数は多数あります。PHP が問題であるとすぐに思い込まないことをお勧めします。

まず、どのように PHP を提供していますか? Apache または IIS 自体の基本的な最適化を試しましたか? サーバーは他の種類のリクエストの処理でビジーですか? PHP コード アクセラレータを利用したことがありますか。サーバーがボトルネックになっているかどうかをテストする 1 つの方法は、アプリケーションを別のサーバーで実行してみることです。

次に、アプリケーション全体のパフォーマンスが遅いですか、それとも特定のページだけに影響しているように見えますか? これにより、パフォーマンスの分析を開始する場所がわかります。アプリケーション全体が遅い場合は、基盤となるサーバー/プラットフォーム、またはすべての要求の一部であるグローバル SQL クエリ (ユーザー認証など) に問題がある可能性が高くなります。

3 番目に、SQL クエリの数を最小限に抑えることについて言及されましたが、既存のクエリの最適化についてはどうでしょうか。MySQL を使用している場合、各ストレージ システムのさまざまな長所を活用していますか? 最も重要なクエリに対してEXPLAINを実行して、適切にインデックスが作成されていることを確認しましたか? これは、大きなテーブルにアクセスするクエリでは重要です。データセットが大きくなればなるほど、不十分なインデックス作成の影響に気付くことになります。幸いなことに、この記事のように、EXPLAIN の使用方法を説明する記事がたくさんあります。

第 4 に、よくある間違いは、データベース サーバーがシステムで利用可能なすべてのリソースを自動的に使用すると思い込むことです。データベース アプリケーションに十分なリソースが明示的に割り当てられていることを確認する必要があります。たとえば、MySQL では、キー バッファー、一時テーブル サイズ、スレッド同時実行数、innodb バッファー プール サイズなどのカスタム設定を (my.cnf ファイルに) 追加する必要があります。

上記のすべてを再確認してもボトルネックが見つからない場合は、Xdebug などのコード プロファイラーが役立ちます。個人的には、Zend Studio プロファイラーの方が好みですが、Zend Platform スタックの残りの部分を既に利用していない限り、最適なオプションではない可能性があります。ただし、私の経験では、PHP 自体がパフォーマンス低下の根本的な原因であることは非常にまれです。多くの場合、コード プロファイラーは、どの DB クエリが原因であるかをより正確に判断するのに役立ちます。

于 2008-09-15T16:28:45.770 に答える
3

また、APD (Advanced PHP Debugger) を使用することもできます。

それを機能させるのはとても簡単です。

$ php apd-test.php

$ pprofp -l pprof.SOME_PID

Trace for /Users/martin/develop/php/apd-test/apd-test.php
Total Elapsed Time = 0.12
Total System Time  = 0.01
Total User Time    = 0.07


         Real         User        System             secs/    cumm
%Time (excl/cumm)  (excl/cumm)  (excl/cumm) Calls    call    s/call  Memory Usage Name
--------------------------------------------------------------------------------------
71.3 0.06 0.06  0.05 0.05  0.01 0.01  10000  0.0000   0.0000            0 in_array
27.3 0.02 0.09  0.02 0.07  0.00 0.01  10000  0.0000   0.0000            0 my_test_function
 1.5 0.03 0.03  0.00 0.00  0.00 0.00      1  0.0000   0.0000            0 apd_set_pprof_trace
 0.0 0.00 0.12  0.00 0.07  0.00 0.01      1  0.0000   0.0000            0 main

APD をコンパイルしてプロファイリングを作成する方法についての素晴らしいチュートリアルがあります: http://martinsikora.com/compiling-apd-for-php-54

于 2013-03-30T09:51:33.740 に答える
2

Xdebugプロファイルは間違いなく進むべき道です。もう1つのヒント-WincacheGrindは優れていますが、最近更新されていません。 http://code.google.com/p/webgrind/-ブラウザを使用するのが簡単で迅速な代替手段かもしれません。

とにかく、それはまだデータベースである可能性があります。関連するインデックスを確認します。また、可能な限り多くの作業データをキャッシュするのに十分なメモリがあることを確認します。

于 2008-09-13T00:24:34.370 に答える
2

phpED ( http://www.nusphere.com/products/phped.htm ) も優れたデバッグとプロファイリングを提供し、PHP コードにウォッチやブレークポイントなどを追加する機能も備えています。統合されたプロファイラーは、IDE 内から各関数呼び出しとクラス メソッドの時間内訳を直接提供します。ブラウザ プラグインを使用すると、Firefox または IE との迅速な統合も可能になります (つまり、ブラウザで低速 URL にアクセスし、ボタンをクリックしてプロファイルまたはデバッグします)。

ほとんどのコーディング作業に集中するために、アプリが遅い場所を指摘するのに非常に役立ちました。また、すでに高速なコードを最適化するために時間を浪費することもありません。Zend と Eclipse を試してみて、phpED の使いやすさに納得しました。

Web サーバーに対してデバッグする場合、Xdebug と phpED (DBG を使用) の両方に追加の PHP モジュールをインストールする必要があることに注意してください。phpED は、ローカル デバッグ オプションも提供しています (私が試したことはありません)。

于 2008-09-11T21:02:48.950 に答える
1

PHP で register_tick_function 関数を使用することもできます。これは、コード全体で定期的に特定の関数を呼び出すように php に指示します。その後、現在実行中の関数と呼び出し間の時間を追跡できます。すると、何が最も時間がかかっているかがわかります。 http://www.php.net/register_tick_function

于 2008-09-12T19:11:09.803 に答える
1

コードベースが大きい場合は、まだ試していない場合は apc を試してください。

http://pecl.php.net/package/APC

于 2008-09-11T20:32:06.047 に答える
0

私はPEAR Benchmarklog4phpを組み合わせて使用​​しています。

プロファイリングするスクリプトの先頭に、 Benchmark_Timerオブジェクトをラップするオブジェクトを作成します。コード全体で$object->setMarker("name");、特に疑わしいコードの周りに呼び出しを追加します。

ラッパー クラスには、ログ情報を取得して log4php に書き込む destroy メソッドがあります。通常、これを syslog に送信します (多数のサーバー、1 つのサーバー上の 1 つのログ ファイルに集約)。

デバッグでは、ログ ファイルを見て、どこを改善する必要があるかを確認できます。本番環境の後半では、ログ ファイルを解析してパフォーマンス分析を行うことができます。

これは xdebug ではありませんが、常にオンになっており、コードの 2 つの実行を比較することができます。

于 2008-09-11T14:50:03.340 に答える
0

Zend 開発環境 (windows) を使用します。Process Explorer の実行中にデバッガーをステップ実行して、各行が実行されるたびにメモリ/CPU/ディスクのアクティビティを監視することで、昨日のメモリ使用量の急増を解決しました。

プロセス エクスプローラー: http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

ZDE には、ページ要求中に各関数呼び出しに費やされた時間を表示できる基本的なパフォーマンス プロファイラーが含まれています。

于 2008-09-11T03:47:59.610 に答える
0

サーバーのパフォーマンス低下がアプリケーションの処理速度低下の原因である場合は、 HA プロキシまたはその他の負荷分散ソリューションを検討することもできます。サーバ。

于 2015-05-13T08:38:04.280 に答える