ホームページ バックエンド開発 PHPチュートリアル XHGui を使用した PHP パフォーマンスのテストに関するチュートリアル

XHGui を使用した PHP パフォーマンスのテストに関するチュートリアル

Jul 25, 2016 am 08:45 AM

プロファイリングは、プログラムのパフォーマンスを観察するために使用されるテクノロジーであり、プログラムのボトルネックや逼迫したリソースを発見するのに非常に適しています。プロファイリングでは、プログラムを深く掘り下げて、リクエスト処理プロセスのコードの各部分のパフォーマンスを表示することができます。同時に、問題のあるリクエスト (リクエスト) を特定し、パフォーマンスの問題が発生している場所を特定することもできます。リクエスト内で発生します。 PHP にはさまざまなプロファイリング ツールがありますが、この記事では主に、非常に優れたツールである XHGui に焦点を当てます。 XHGui は XHProf (XHProf は Facebook によってリリースされています) に基づいて構築されていますが、分析結果のためのより優れたストレージとより優れた情報取得インターフェイスが追加されています。この点で、XHGui はまったく新しいツールのようなものです。

XHGui は何度か改良を重ねてきましたが、現在のバージョンではより美しいユーザー インターフェイスが提供され、プロファイリング結果の保存に MongoDB が使用されています。以前のバージョンと比較すると、これらすべての点が大幅に改善されています。以前のバージョンは、データを保存するためにファイルを使用する開発者向けの設計に近く、収集されたデータの使用が非常に困難だったためです。 XHGui 2013 は、管理者と開発者の両方にとって非常に包括的なプロファイリング ツールであると同時に、運用環境で実行できるほど軽量になるように設計されています。

この記事では、プログラムのインストールを段階的に説明し、このツールを使用して収集できる情報のあらゆる側面を示します。

ステップ 1: 依存関係をインストールする

XHGui にはいくつかの依存関係があるため、最初のステップはこの問題を解決することです。以下のすべてのチュートリアルは Ubuntu 13.04 プラットフォームに基づいています。もちろん、それらを調整して独自のプラットフォームに適用できるはずです。現時点では、MongoDB、PHP をインストールし、PECL 拡張機能をインストールする機能が必要です。

まず、MongoDB をインストールする必要があります。ここにいくつかの公式インストール チュートリアルがあり、システムに関連する詳細を見つけることができますが、今のところは単純に APT を介してインストールします。

  1. aptitude install mongodb
コードをコピー
本製品の更新速度は非常に速いため、この方法で取得したMongoDBのバージョンは最新ではない可能性があります。ただし、最新バージョンを維持したい場合は、MongoDB が提供するライブラリをパッケージ マネージャーに追加して、最新バージョンを入手できます。

同時に、PHP 用の Mongo ドライバーも必要です。リポジトリ内のドライバーのバージョンは少し古いため、今日のデモでは Pecl から入手します。マシンに pecl コマンドがない場合は、次のコマンドを使用してインストールできます:


  1. aptitude install php-pear
コードをコピー
次に、次のコマンドを使用して MongoDB のドライバーを PHP に追加します。



  1. pecl mongo をインストール
コードをコピー
インストールを完了するには、最後に php.ini ファイルに新しい行を追加する必要があります。ただし、Ubuntu の新しいバージョンでは、Apache モジュールのインストールによく似た PHP 拡張機能を構成するための新しいシステムが提供されます。すべての構成を 1 か所に保存し、構成を起動するためのシンボリック リンクを作成します。まず、設定を保持するファイルを作成します。ただし、この例では、拡張機能を有効にするために設定に新しい行を追加するだけです。これをファイル /etc/php5/mods-available/mongo.ini に保存し、次の行を追加します。



    php5enmod mongo
コードをコピー
pecl を再度使用して、xhprof 拡張機能をインストールします。このプログラムは現在ベータ版のみであるため、インストールコマンドは次のとおりです:


    pecl xhprof-beta をインストール
コードをコピー
コマンドラインでは、php.ini に新しい行を追加するよう再度求められます。上記と同じ方法を使用して、ファイル /etc/php5/mods-available/xhprof.ini を作成し、次の内容をそれに追加します。



extension=xhprof.so
  1. コードをコピー
この時点で、コマンドラインで php -m コマンドを実行することで、これらのモジュールが正しくインストールされていることを確認できます。 Web インターフェイスでこれらの拡張機能を有効にできるように、Apache を再起動することを忘れないでください。

XHGuiをインストール

XHGui 自体は主に Web ページで構成されており、XHProf 拡張機能によって収集されたデータにより使いやすいインターフェイスを提供します。コードベースの GitHub リポジトリからクローンを作成することも、zip ファイルを直接ダウンロードして解凍することもできます。プログラムを入手したら、キャッシュ ディレクトリに十分な権限があり、Web サーバーがファイルを書き込む権限を持っていることを確認してください。最後に、インストール スクリプトを実行します:

  1. php install.php
コードをコピー

これはプログラムのインストールに必要なすべてであり、一部の依存プログラムは自動的にインストールされます。例外が発生した場合は、インストーラーからもプロンプトが表示されます。

XHGui を仮想ホストにインストールすることを好みます。これには、.htaccess ファイルが許可され、RUL 書き換えが有効になる必要があります。 URL 書き換えの開始は、mod_rewrite モジュールを開始し、次のコマンドを渡す必要があることを示します:

  1. a2enmod書き換え
コードをコピー

(Apache を再起動することを忘れないでください)。すべてがうまくいけば、XHGui URL に通常どおりアクセスして、次のコンテンツを確認できます:

201573145850225.png (300×210)

仮想ホストで XHGui を起動します

この時点で、Web サイトのパフォーマンスをテストするために XHGui を起動したいと思います。最適化の効果を検出するには、最適化の前にパフォーマンス テストを実行するのが最適であることに注意してください。最も簡単な方法は、以下の図に示すように、仮想ホストに auto_prepend_file ステートメントを追加することです。

  1. ServerName example.local
  2. DocumentRoot /var/www/example/htdocs/
  3. php_admin_value auto_prepend_file /var/www/xhgui/external/header.php
  4. オプション FollowSymLinks Indexes
  5. すべてのAllowOverride
コードをコピー

すべての準備が完了したら、ウェブサイトのリクエストの分析を開始できます。 XHGui がプロファイリングするのは Web サイト リクエストの 1% のみであるため、XHGui が意味のあるデータを取得するには、XHGui を一定期間実行するか、Apache Bench などのテスト ツールを使用してリクエストのバッチをバッチ送信する必要があります。 XHGui が 100 件のリクエストのうち 1 件しか解析しないのはなぜですか? XHGui は運用環境での使用に十分軽量になるように設計されており、リクエストごとに追加のオーバーヘッドが発生することを望まないため、1% のサンプリング レートで Web サイト全体のトラフィックのより明確な概要をすでに提供できます。

データを確認する

この記事のすべての例を実行するためにテスト仮想マシンを使用し、テスト コードとして Join.in API を使用します。トラフィックを生成するために、API テスト ケースを数回実行しました。負荷をかけた状態でデータを収集することもできるので、ストレス テスト中に XHGui を使用することもできます。また、XHGui を使用してライブ サイトでデータを収集することもできます (クレイジーに聞こえるかもしれませんが、Facebook はこのアプリケーション用にこのツールを公式に開発しました)。特定のリクエストをアプリケーションに送信した後、XHGui に再度アクセスすると、データが保存されています。

201573145913073.png (300×210)

このグラフは、XHGui が分析した各リクエストを示しています。最新のリクエストが最初にリストされ、各リクエストの追加情報が表示されます。この情報には次のものが含まれます:

  • URL: リクエストによってアクセスされた URL
  • 時間: リクエストの開始時間
  • wtor: 「ウォールタイム」 – リクエストにかかったすべての時間。これは「ウォールクロック」時間の略で、ユーザーがリクエストが完了するまで待機したすべての時間を意味します。
  • cpu: このリクエストに費やされた CPU 時間
  • mu: このリクエストによって消費されるメモリ
  • pmu: リクエスト処理中に消費される最大メモリ
各リクエスト (「実行」) に関する詳細情報を取得するには、興味のある各リクエストの列をクリックします。 URL をクリックすると、その URL に対するすべてのリクエストに関する詳細情報を取得できます。いずれの方法でも、リクエストに関する詳細情報を取得できます:


201573145938626.png (300×210)

201573145957832.png (300×210)

これは非常に長く、非常に詳細なページなので、スクリーンショットを 2 枚引用しました (すべての情報を表示するには 5 枚のスクリーンショットが必要です)。上の図の左側には、これらの統計がどの側面に関連しているかを追跡するのに役立つ、リクエストに関連するいくつかの情報が表示されます。右側の主要な部分には、最も時間のかかる部分とリクエスト中の各関数呼び出しに費やされた時間が表示されます。プロセスのメモリが消費されます。グラフの下には各列を示す主キーがあります。

2 番目の図は、リクエストの各コンポーネントに関する詳細情報を示しています。 CPU やメモリの情報を含む、各部分の呼び出し数と消費時間を確認できます。包括的情報と排他的情報の両方が詳細に表示されます。排他的とは、メソッド呼び出しによって発生した消費のみを意味します。包括的とは、この関数によって発生した消費だけでなく、この関数によって呼び出された他の関数によって発生した消費も含まれます。

XHGui のもう 1 つの機能は、「コールグラフ」です。「コールグラフ」は、時間がどのように消費されるかを鮮やかな仮想方法で表示します。

201573150016938.png (300×210) これは関数呼び出しの階層をうまく示しています。最も良い点は、図が対話型であり、ドラッグして接続を詳しく確認したり、BLOB 上にマウスを移動して詳細を表示したりできることです。操作すると跳ねたりふざけて動いたりするので、それほど重要な機能ではありませんが、私にとってはとても楽しかったです。

データを理解する

多くの統計を取得することは重要ですが、どこから始めればよいかを知るのは難しい場合があります。ページのパフォーマンスが期待したほど良くない場合は、次の手順を実行します。 まず、各関数の排他 CPU 時間を並べ替えて、最も時間を消費する関数のリストを表示します。これらの時間のかかる関数呼び出しを分析し、リファクタリングして最適化します。

変更を加えたら、プロファイリング ツールでプログラムの新しいバージョンを再度チェックして、パフォーマンスの向上をテストします。 XHGui には、2 つの実行を比較するのに最適なツールが組み込まれています。詳細ページの右上隅にある「この実行を比較」ボタンをクリックするだけです。このボタンには、この URL の各テストの結果が表示され、そこから比較するオブジェクトを選択できます。比較したいオブジェクトの「比較」ボタンをクリックすると、以下の図に示すように、XHGui が比較ビューに変わります。


201573150035219.png (300×210)

統計表には、各情報の変更の実際の数と割合を含め、統計の新バージョンと旧バージョンの主な違いが表示されます。上の図は、新バージョンのリクエスト待ち時間が旧バージョンのわずか 8% であることを示しています。統計表には各統計情報の詳細な変化が表示されます。これは「詳細」ページでよく表示されます。任意の列を並べ替えて、興味のある情報を見つけることができます。

1 つの領域でリファクタリングが成功したら、詳細ページをチェックして新しいバージョンが実際にどのように動作するかを確認し、最適化する他の領域を選択します。メモリ使用量や排他的経過時間を並べ替えて、アプリケーション全体のパフォーマンスを最大化する機能を選択して最適化してください。同時に、呼び出し数を確認することを忘れないでください。関数を繰り返し呼び出すと、最適化後にプログラムのパフォーマンスが飛躍的に向上します。

最適化手法

結果を定量化する前に、どれだけ改善したかを知るのは困難です。そのため、アプリを最適化する前にテストすることがよくあります。そうでない場合、アプリが本当に最適化されているかどうかはどうやってわかりますか?また、実際のデータのセットをどのように表現すべきかについても考える必要があります。そうしないと、不可能な目標に向かってしまう可能性があります。非常に便利な方法は、最適なデータ構造と使用する必要のある最小のストレージ容量を見つけるために最善を尽くすことです。好みの作業環境で「Hello world」プログラムを 0.5 秒で実行できない場合は、同じツールで構築された Web ページが適切に動作することを期待しないでください。

上記の説明はプログラミング フレームワーク (フレームワーク) を軽視しているわけではありません。プログラミング フレームワークは使いやすく、迅速な開発をサポートし、保守が容易であるために存在します。手動でコードを記述する場合と比較して、プログラミング フレームワークのパフォーマンスが低下するのは、あらゆる面で妥協した結果です。アプリケーション開発にプログラミング フレームワークを使用すると、必要に応じてプロファイリング ツールを使用してプログラムのパフォーマンスを分析し、改善することができます。たとえば、Zend Framework 1 の多くのモジュールは非常に強力な機能を提供しますが、非常に時間がかかります。プロファイリング ツールを使用すると、パフォーマンスの低い部分を特定して置き換えることができます。他のすべてのフレームワークにも同様の問題があり、XHGui は問題の場所を示し、それがアプリケーションに定量的な影響を与えているかどうかを確認できます。


プログラムの外では、遅かれ早かれ、優位性を得るために他の戦略が役に立つかもしれません:

  • 危険なほど遅くはないものの、関連する機能がページに表示されることに注意してください。ページの時間の 50% が、書式設定ポイントを処理するビュー ヘルパーの一連の関数に費やされている場合 (これは仮説の例であることをお約束します)、コンポーネント全体のリファクタリングを検討することをお勧めします。
  • やることを減らしましょう。パフォーマンスが機能よりも重要な場合は、機能を削除してみてください。
  • 1 回のリクエストで生成されたが特定のビューでは使用されないコンテンツ、または変更されていないが複数回再生成されたコンテンツに注意してください。
  • 優れたキャッシュ戦略。これについては別の記事にしますが、PHP で OpCode キャッシュ (PHP 5.5 で組み込まれている) を使用し、Web サーバーの前にリバース プロキシを追加し、頻繁に変更されないコンテンツを提供するだけで適切なキャッシュ ヘッダーを送信することを検討してください。
  • 暴力的なデカップリング。リソースを大量に消費する特別な機能がある場合は、Web サーバーから削除してください。おそらく、非同期的に処理できるため、プログラムはメッセージをキューに追加するだけでよいし、別のサーバーに移動して別のサービス モデルとしてアクセスすることもできます。いずれの場合でも、分離すると Web サーバーの負荷が軽減され、効率的なスケーリングが可能になります。

XHGui はあなたの友達です

XHGui はインストールが簡単で、使用するときにすぐに使用でき、出力は取締役会でプレゼンテーションできるほど優れています。これはアプリのバグを特定し、アプリが実際に動作する (または動作しない) ことを確認するのに役立ちます。これにはいくつかの繰り返しのプロセスが必要になる可能性がありますが、これまでに XHProf または XHGui を使用したことがあるかどうかに関係なく、時間をかけてアプリケーションで試してみることをお勧めします。その結果に驚かれることでしょう。

XHGui、PHP


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

セッションのハイジャックはどのように機能し、どのようにPHPでそれを軽減できますか? セッションのハイジャックはどのように機能し、どのようにPHPでそれを軽減できますか? Apr 06, 2025 am 12:02 AM

セッションハイジャックは、次の手順で達成できます。1。セッションIDを取得します。2。セッションIDを使用します。3。セッションをアクティブに保ちます。 PHPでのセッションハイジャックを防ぐための方法には次のものが含まれます。1。セッション_regenerate_id()関数を使用して、セッションIDを再生します。2。データベースを介してストアセッションデータを3。

確固たる原則と、それらがPHP開発にどのように適用されるかを説明してください。 確固たる原則と、それらがPHP開発にどのように適用されるかを説明してください。 Apr 03, 2025 am 12:04 AM

PHP開発における固体原理の適用には、次のものが含まれます。1。単一責任原則(SRP):各クラスは1つの機能のみを担当します。 2。オープンおよびクローズ原理(OCP):変更は、変更ではなく拡張によって達成されます。 3。Lischの代替原則(LSP):サブクラスは、プログラムの精度に影響を与えることなく、基本クラスを置き換えることができます。 4。インターフェイス分離原理(ISP):依存関係や未使用の方法を避けるために、細粒インターフェイスを使用します。 5。依存関係の反転原理(DIP):高レベルのモジュールと低レベルのモジュールは抽象化に依存し、依存関係噴射を通じて実装されます。

システムの再起動後にUnixSocketの権限を自動的に設定する方法は? システムの再起動後にUnixSocketの権限を自動的に設定する方法は? Mar 31, 2025 pm 11:54 PM

システムが再起動した後、UnixSocketの権限を自動的に設定する方法。システムが再起動するたびに、UnixSocketの許可を変更するために次のコマンドを実行する必要があります:sudo ...

phpstormでCLIモードをデバッグする方法は? phpstormでCLIモードをデバッグする方法は? Apr 01, 2025 pm 02:57 PM

phpstormでCLIモードをデバッグする方法は? PHPStormで開発するときは、PHPをコマンドラインインターフェイス(CLI)モードでデバッグする必要がある場合があります。

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? Apr 01, 2025 pm 03:12 PM

PHP開発でPHPのCurlライブラリを使用してJSONデータを送信すると、外部APIと対話する必要があることがよくあります。一般的な方法の1つは、Curlライブラリを使用して投稿を送信することです。

See all articles