ホームページ >バックエンド開発 >PHPチュートリアル >PHP Opcache の仕組みの詳細な分析
PHP プロジェクト、特に同時実行性が高くトラフィックが大きいシナリオでは、PHP の応答時間をいかに改善するかが非常に重要なタスクです。
Opcache は、特に PHP フレームワークを適用するプロジェクトにおいて、PHP のパフォーマンスを最適化するために不可欠なコンポーネントです。
OPCache 関数を理解する前に、まずPHP-FPM を理解する必要があります。 Nginx の動作メカニズム、および PHP スクリプトの解釈と実行のメカニズム。
1.1 PHP-FPM Nginx の動作メカニズム
リクエストは Web ブラウザから Nginx に送られ、その後 PHP 処理に送られます。全体のプロセスは次のとおりです。 5 つのステップ:
ステップ 1: サービスの開始
第 2 ステップ: リクエスト => Nginx
##3 番目のステップ: Nginx => PHP-FPM
ステップ 4: PHP-FPM マスター => ワーカー
PHP-FPMワーカープロセスは処理結果を返し、コネクションを閉じる次のリクエストを待つ
#PHP Nginx の全体的な処理の流れを理解したら、次は PHP スクリプトの具体的な実行プロセスを見てみましょう。##最初に例を見てみましょう:
えええええ実行プロセスを分析してみましょう:
php は実行リンクを初期化し、Zend エンジンを開始します、登録された拡張モジュールをロードします
初期化後、スクリプト ファイルが読み取られ、Zend エンジンはスクリプト ファイルに対して字句解析 (lex)、構文解析 (bison) を実行し、構文ツリー
Zend エンジンが構文ツリーをコンパイルし、オペコードを生成します#、
Zend エンジンオペコードを実行#、実行結果を返す
PHP-FPM モードでは、ステップ 1) は PHP-FPM の開始時に 1 回実行され、後続のリクエストでは実行されません。ステップ 2) ~4) はリクエストごとに 1 回実行する必要があります;実際、ステップ 2) と 3) で生成された構文ツリーとオペコードは、同じ PHP スクリプトを実行するたびに同じ結果になります。
PHP-FPM モードの場合 次に、各リクエストを再度処理する必要がありますが、これはシステム リソースの多大な無駄になります。
もちろん、次のようなものです:
OPCache: 以前は Zend Optimizer として知られていましたが、これは Zend Server のオープン ソース コンポーネントであり、公式製品であり、強く推奨されますOPcache 拡張機能は、PHP 5.5.0 以降のバージョンにバンドルされています。
2 種類のコンテンツをキャッシュします:
OPCodeこれにはメモリ共有メカニズムが関係します。また、すべてのメモリ リソース操作にはロックの問題があります。1 つずつ説明します。 3.1 共有メモリ
UNIX/Linux システムには、プロセス間でメモリを共有するためのさまざまな方法が用意されています。 -V shm API: System V 共有メモリ、sysv shm は永続的です。プロセスによって明示的に削除されない限り、システムがシャットダウンされるまで常にメモリ内に存在します;
mmap API:
共有メモリ: 単位時間内に書き込み操作を実行できるのは 1 つのプロセスのみであり、読み取り操作を実行できるのは複数のプロセスです。書き込み操作は同時に実行され、読み取られます。操作がブロックされないため、ロックされる状況はほとんどありません。
これは別の問題を引き起こします: 新しいコード、大規模なトラフィックのシナリオ、プロセスはキャッシュ オペコード操作を実行するためにキューに入れられ、繰り返しの書き込みはリソースの無駄につながります。4. OPCache キャッシュの解釈
OPCache は公式の Opcode キャッシュ ソリューションで、PHP5.5 バージョン以降は PHP ソース コードにパッケージ化され、一緒にリリースされています。 PHP のコンパイルによって生成されたバイトコードとデータを共有メモリにキャッシュし、リクエストごとに、コンパイルされたオペコードがキャッシュから直接読み取られて実行されます。 スクリプトのコンパイルプロセスを節約することで、PHP の実行効率を向上させます。 同じジョブを実行するために APC 拡張機能を使用している場合、特に PHP7 では、代わりに OPCache を使用することが強く推奨されます。4.2 インターンされた文字列キャッシュ
まず、インターンされた文字列とは何なのかを理解する必要があります。
PHP5.4 では、PHP の文字列のストレージと処理を最適化するために、Interned String メカニズムが導入されました。
特に、PHP ドキュメントなどの大きな文字列チャンクを扱う場合、Interned String はメモリを最適化できます。
Interned String キャッシュされたコンテンツには次のものが含まれます: 変数名、クラス名、メソッド名、文字列、コメント など。
PHP-FPM モードでは、インターンされた文字列キャッシュ文字はワーカー プロセス内に限定されます。
OPCache にキャッシュされた Interned String キャッシュされた文字列は、ワーカー プロセス間で使用してメモリを節約できます。
PHP 開発では通常、大きなコメントがあり、それらも OPCache にキャッシュされます。 php.ini の設定を通じてコメントのキャッシュをオフにすることができます。
ただし、Zend Framework などのフレームワークでは
がコメントを参照するため、コメントのキャッシュをオフにするかどうかは別の方法で扱う必要があります。
5. OPCache 更新戦略OPCache の更新戦略は非常にシンプルで、期限切れのデータは「Wasted」に設定され、設定値に達するとキャッシュがクリアされ、キャッシュが再構築されます。
ここで注意してください:
高トラフィックのシナリオでは、キャッシュの再構築は非常に多くのリソースを消費します。 OPCache は、キャッシュの作成時に他のプロセスによる読み取りを妨げません。
これにより、多数のプロセスが新しいキャッシュを繰り返し作成することになります。したがって、
OPCache の有効期限を設定しないでください。新しいコードがリリースされるたびに、キャッシュが繰り返し作成されます。それを避けるにはどうすればよいでしょうか?
6.1 メモリ構成
#opcache.preferred_memory_model="mmap"、
shm、
posix、および
win32 が含まれます。
opcache.memory_consumption=64
#opcache.interned_strings_buffer =4
一時文字列の保存に使用されるメモリ サイズ (メガバイト単位)、デフォルト
##opcache.max_wasted_percentage=5 無駄なメモリの上限 (パーセント単位)。この制限に達すると、OPcache は再起動イベントを生成します。デフォルト
#6.2 キャッシュできるファイルの数とサイズopcache .max_accelerated_files=2000 OPcache ハッシュ テーブルに保存できるスクリプト ファイルの最大数。実数値は、素数セット
{ 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 }、最大値は PHP 5.5.6 より前では
100000、PHP 5.5.6 以降では
1000000 です。デフォルト値
2000
opcache.max_file_size=0 キャッシュされたファイルの最大サイズ (バイト単位)。すべてのファイルをキャッシュするには 0 に設定します。デフォルト値 0
6.3 コメント関連キャッシュopcache.load_comments
boolean と組み合わせて使用すると、コメントのコンテンツをオンデマンドで読み込むことができます。
opcache.fast_shutdown boolean 有効にすると、高速停止再開イベントが使用されます。いわゆるクイック停止再開イベントは、割り当てられた各メモリ ブロックを順番に解放するのではなく、Zend エンジンに依存して、要求されたすべての変数のメモリを一度に解放するメモリ管理モジュールを指します。
#6.4 2 次キャッシュ構成
opcache.file_cache
2 次キャッシュ ディレクトリを構成し、2 次キャッシュを有効にします。 2 次キャッシュを有効にすると、SHM メモリがいっぱいになった場合、サーバーが再起動された場合、または SHM がリセットされた場合のパフォーマンスが向上します。デフォルト値は空の文字列 ""
で、ファイルベースのキャッシュが無効になります。 opcache.file_cache_only
boolean
共有メモリ内のオペコード キャッシュを有効または無効にします。 opcache.file_cache_consistency_checks
boolean
ファイル キャッシュからスクリプトをロードするときにファイルのチェックサムを検証するかどうか。 opcache.file_cache_fallback
boolean
Windows プラットフォームでは、プロセスが共有メモリに接続できない場合、ファイルベースのキャッシュ、つまり opcache が使用されます。 file_cache_only=1
。ファイル キャッシュは明示的に有効にする必要があります。 推奨学習: 「PHP ビデオ チュートリアル 」
以上がPHP Opcache の仕組みの詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。