PHPのパフォーマンスを向上させる5つの方法-Tideways
5 PHPのパフォーマンスを向上させる方法
ボーナス:私たちは私たちのポッドキャストでPHPコミュニティの専門家とこのトピックを議論してきました:
しかし、PHP開発者やシステム管理者として、パフォーマンスをさらに向上させるためにできることはいくつかあります。
この記事では、それらの5つの方法をステップスルーします。 読み終わる頃には、PHPアプリケーションのパフォーマンスが少なくとも顕著に向上するはずです。 始めましょう
PHP7を使用する
PHPのパフォーマンスを向上させる最良の方法の一つは、最新バージョン(PHP7)を実行することです。 これは、以前のバージョンよりも大幅な速度の向上を提供しています。 今、結果は常に二つのアプリケーションが同じではないので、変化します。 しかし、さまざまな開発者や注目すべきホスティング会社の報告に基づいて、パフォーマンスの改善は重要です。
ここに小さなサンプルがあります:
- 公式のPHPベンチマークは、PHP7がPHP5.6と比較して毎秒二倍のリクエストを実行できることを報告しています。
- KinstaのPHPパフォーマンスベンチマークでは、WordPress5.0はPHP5.6の3倍のトランザクションを実行できることが示されており、
- PantheonはPHP7がバージョン5.3より64%改善されたと報告している。
それだけでは不十分な場合は、ベンチマークを確認して、彼らの言うことを確認してください。
さらに、PHP7.0.0がDecember3rd,2015にリリースされ、最新の安定版7.3.6が今年May30にリリースされました。
さらに、PHP5、5.6の最終リリースは、7ヶ月前の2018年12月31日にEOL(End of Life)になりました。 あなたがまだ持っていないのであれば、それはあなたがPHP7への移行をした時をよく過ぎています。 アップグレードを行い、RasmusがphpCE2018で述べたように、ホスティングコストを削減することでgreen(er)に進みます。
Xdebugのアンインストール
次に確認することは、Xdebugが本番サーバーにインストールされていないことです。 確かに、XdebugはPHPのための最も洗練された包括的なプロファイラとデバッガの一つですが、少なくともXdebug3がリリースされ、あなたがそれで動作するようにDerickをサポートするために私たちに参加する必要がありますまで、それは、本番サーバー上で有効にする(インストールされていても)べきではありません。
パフォーマンスベンチマークは異なりますが(常に異なります)、Stack Overflowに関するあるレポートでは、Xdebugを完全に削除することで50%のパフォーマンスが向上しました。 さらに、Xdebugがサーバーにインストールされていても、有効になっていないことに注意することが重要です!
Xdebug performance benchmark
インストールされているかどうかを確認するには、php -m | grep -i xdebug
を実行するか、ホスティングプロバイダーの管理パネルを確認します。 また、Xdebugがどのように機能するかについてもっと知りたい場合は、Xdebugのドキュメントをチェックしてください。
Composer Optimize Autoloaderを使用する
Composerを使用してパッケージ管理を処理することに精通している可能性がありますが、生成される構成の最適化を検討しないと、アプ
ここでは、理由を説明する作曲家のドキュメントからの引用です:
PSR-4とPSR-0の自動ロードルールが設定されているため、クラス名を最終的に解決する前にファイルシステムをチェックする必要がある。 これはかなり遅くなりますが、新しいクラスを追加すると、オートローダー設定を再構築することなくすぐに検出/使用できるため、開発環境では便利です。
パフォーマンスを向上させるために、Composerは三つの最適化レベルを提供しています。:
- クラスマップの生成
- 権限のあるクラスマップ
- APCuキャッシュ
1: クラスマップの生成
この戦略は、PSR-4/PSR-0ルールをクラスマップルールに変換します。 この戦略は、classmapが既知のファイルへのフルパスを即座に返すことができ、ファイルシステムのstat操作を回避できるため、より高速です。
この最適化レベルを有効にするには、次のコマンドを実行します:
composer dump-autoload --optimize
2/A: 権威クラスマップ
レベル1を自動的に有効にすることに加えて、このレベルを使用すると、生成されたクラスマップにクラスが見つからない場合、オートローダはPSR-4ルールに従ってファイルシステムを検索しようとしません。 この最適化レベルを有効にするには、次のコマンドを実行します:
composer dump-autoload --classmap-authoritative
2/B:APCu cache
このレベルでは、クラスマップのフォールバックとしてAPCuキャッシュが追加されます。 ただし、classmapは生成されません。 それを考えると、レベル1を手動で有効にする必要があります。 この最適化レベルを有効にするには、次のコマンドを実行します:
composer dump-autoload --apcu
トレードオフがあります
これらのレベルはそれぞれアプリケーションのパフォーマンスを向上させることができますが、使用する前に理解する必要があるトレードオフがあります。 Composerを使用する前に、必ずComposerのドキュメントを参照してください。
OPcacheを使用する
PHPはコンパイルされた言語ではなく解釈されているため、PHPランタイムは実行する前にソースコードを実行可能なバイトコードに変換 また、PHPはshared-nothingアーキテクチャであるため、このプロセスは各要求で実行する必要があります。
しかし、オペコードキャッシュ(OPcache)では、生成されたオペコードは共有メモリにキャッシュされ、代わりにそこで参照できるため、この手順はファイルごとに一度だけ実行する必要があります。
だから、あなたが想像できるように、OPcacheは、コードを変更する必要がないので、PHPアプリケーションのパフォーマンスを向上させるための最も集中的な方法の いくつかのレポートは、70%の速度向上まで表示されます。
PHPには長年にわたっていくつかのオペコードキャッシュがありました。 OPCache(旧Zend Cache)はバージョン5.5以降PHPにバンドルされており、PHP7ではデフォルトで有効になっています。
それについての詳細を知るには、OPcacheのドキュメントをチェックしてください。 OPcacheのパフォーマンス調整の詳細については、Hayden Jamesの優れた記事とtidewayのtuningに関する投稿をチェックしてください。
Php7プリロードを使用してください
PHP7.4の新しいプリロード機能について聞いたことがない場合は、まだ、それは非常にクールです! 一言で言えば、この機能はOpcacheの機能をこれまで以上に活用しています。
すぐに要約するには、PHPソースファイルが初めて検出されたときに、Zend Engineが実行できるようにする前に、解析してからマシン依存のバイトコードにコン Opcachesは、ソースコードが最初に解析されてコンパイルされた後、バイトコードが共有メモリのオペコードキャッシュに格納されるため、このプロセスのオーバヘッドを大幅に削減します。
次回そのファイルへのリクエストに遭遇したとき、PHPはオペコードキャッシュにファイルのバイトコードがあるかどうかをチェックします。 そうであれば、それらは返されて使用されます。 そうでない場合(またはバイトコードのコンパイル後にソースファイルが変更された場合)、ソースファイルは解析、コンパイル、およびキャッシュされます。 これにより、PHPのパフォーマンスが大幅に向上します。
さて、プリロードの仕組みを見てみましょう。 実装RFCを引用するには:
サーバーの起動時には、アプリケーションコードが実行される前に、特定のPHPファイルをメモリにロードし、その内容をそのサーバーによって提供される後続のすべ これらのファイルで定義されているすべての関数とクラスは、内部エンティティとまったく同じように、すぐに要求に利用できます。 プリロードにより、次のことが保証され:
- これらのファイルで定義されているすべての関数とほとんどのクラスは、PHPの関数テーブルとクラステーブルに永続的にロードされ、将来の要求のコンテクストで永続的に使用できるようになります。
- PHPは、クラスの依存関係と親、インターフェイス、およびトレイトとのリンクを解決します(オペコードキャッシュでは発生しません)。
- PHPは不要なインクルードを削除し、他の最適化を実行します。
フレームワーク(Zend Expressive、Symfony、Laravelなど)を含むアプリケーション全体のコードをメモリにプリロードすることにより、サーバーの再起動時にのみ変更されるコードは、ほとん
つまり、プリロードには、あなたが知っておくべきいくつかの潜在的な欠点があります:
- ソースファイルが変更された場合は、サーバーの再起動が必要です。
- プリロードは共有ホスティング環境では機能しません。
- 同じアプリケーションの複数のバージョンがある場合、プリロードは機能しません。
プリロードは魔法ではありません。 コードと展開プロセスの両方をリファクタリングして、それを利用する必要があります。 たとえば、サーバーの起動時にロードするファイルを決定するためにカスタムローダースクリプトを開発する必要があり、そのスクリプトはサーバーの起動時に実 それにもかかわらず、それは重要な改善、投資する価値のあるものです!
プロファイラ
を使用して、前の五つのいずれかよりも少し多くの作業を取るオプションを使用します。 アプリケーションのパフォーマンスのボトルネックがどこにあるのか、直感的な推測を使用して推測しようとすることがよくあります。
これらは機能しますが、最も効率的なアプローチではありません。 代わりに、コードプロファイラーを使用してコードを分析し、ボトルネックがどこにあるかを示すことができます。 具体的には、次のような質問に答えるのに役立ちます:
- 各メソッドは何回呼び出されましたか?
- 各メソッドの最大実行時間は何時間でしたか?
- 各メソッドの平均実行時間はどれくらいでしたか?
- 何回ファイルが含まれていましたか?
- リクエストがアプリケーションを通過したパス(最初のコードファイルから最後のコードファイルまで)は何ですか?
プロファイラーの結果をドリルダウンすると、アプリケーションが期待していなかったコードパスとクラスを実行していることに驚くことがよくあ
プロファイラレポートの情報に基づいて、アプリケーションが何をしているのかをよりよく理解し、必要に応じて変更するための情報に基づいたリファク
プロファイリングを始めたばかりの場合、PHPにはいくつかのオプションがあります。 最も一般的に使用されるのは次のとおりです:
- Xdebugのプロファイラ
- TidewayのXHProf拡張(&XHGui)
- spxプロファイラ
- forp
結論として、
これらはPHPアプリケーションの品質を特に向上させる五つの方法です。 自分でそれらのいずれかがあなたに顕著なパフォーマンスの向上をお届けします。 但し、一緒に使用されたとき、質、改善を述べないために重要な性能を、見ると期待するべきです。
Leave a Reply