この記事では、PHP opcache に関する関連知識をお届けします。主に OPCache 関数の理解方法と使用方法について説明します。興味のある友人は一緒に見てください。皆さんのお役に立てれば幸いです。
PHP プロジェクト、特に同時実行性が高くトラフィックが大きいシナリオでは、PHP の応答時間をいかに改善するかが非常に重要なタスクです。
Opcache は、特に PHP フレームワークを適用するプロジェクトにおいて、PHP のパフォーマンスを最適化するために不可欠なコンポーネントです。
1. 概要
OPCache 関数を理解する前に、まず PHP-FPM Nginx の動作メカニズムと、PHP スクリプトの解釈と実行のメカニズムを理解する必要があります。
1.1 PHP-FPM Nginx の動作メカニズム
リクエストは Web ブラウザから Nginx に送られ、次に PHP 処理に進みます。合計 5 つのステップがあります:
最初のステップ: サービスを開始する
#PHP-FPM を開始します。 PHP-FPM は 2 つの通信モードをサポートします: TCP ソケットと Unix ソケット;
PHP-FPM は 2 種類のプロセスを開始します: マスター プロセスとワーカー プロセス。前者はポートとワーカー プロセスの監視を担当します。割り当て タスクと管理 ワーカー プロセス。後者は PHP スクリプトの解釈、コンパイル、実行を担当する PHP の CGI プログラムです。
Nginx を起動します。まず、ngx_http_fastcgi_module モジュールがロードされて FastCGI 実行環境が初期化され、FastCGI プロトコル リクエスト プロキシが実装されます。
ここで注意してください: fastcgi ワーカー プロセス (cgi プロセス) は PHP-FPM によって管理されます. Nginxではありません。 Nginx は単なるプロキシです
第 2 ステップ: リクエスト => Nginx
Nginx はリクエストを受信し、それに基づいて設定します場所で、適切なハンドラーを選択します
#プロキシ PHP のハンドラーは次のとおりです
3 番目のステップ: Nginx => PHP- FPM
ステップ 4: PHP-FPM マスター => ワーカー
PHP-FPM マスター プロセスは Socket を通じて処理結果を返します
<p><?php <br> if (!empty($_POST)) {<br> echo "Response Body POST: ", json_encode($_POST), "\n";<br> }<br> if (!empty($_GET)) { <br> echo "Response Body GET: ", json_encode($_GET), "\n";<br> }<br></p>
1.php は、実行リンク、Zend エンジンを開始し、登録された拡張モジュール
2 をロードします。初期化後、スクリプト ファイルを読み取り、Zend エンジンはスクリプト ファイルに対して字句解析 (lex) と構文解析 (bison) を実行して構文を生成します。ツリー3.Zend エンジンは構文ツリーをコンパイルし、オペコードを生成します。
4.Zend エンジンはオペコードを実行し、実行結果を返します PHP cli モードでは、PHP スクリプトが実行されるたびに、 4 つのステップが順番に実行されます; PHP-FPM モードでは、ステップ 1) は PHP-FPM の起動時に一度実行され、以降のリクエストでは実行されません。再度実行します。ステップ 2) ~ 4) は必ず実行されますリクエストごと;
実際、ステップ 2) と 3) で生成された構文ツリーとオペコードでは、同じ PHP スクリプトが実行されるたびに同じ結果が得られます。PHP -FPM モードでは、各リクエストは次のようになります。再度処理すると、システム リソースが膨大に浪費されます。最適化する方法はあるのでしょうか?
もちろん次のようなものです:
##OPCache: 以前は Zend Optimizer として知られていた、Zend Server のオープン ソース コンポーネントです。公式製品であり、強く推奨されます
APC: Alternative PHP Cache は、オープンで無料の PHP オペコード キャッシュ コンポーネントであり、PHP 中間コードのキャッシュと最適化に使用されます。現在は更新されていないため、推奨されません
APCu: APC のブランチであり、メモリを共有し、ユーザー データをキャッシュしますが、オペコードをキャッシュできません。Opcache とともに使用できます。
eAccelerate: こちらも更新されません。推奨されません
xCache:
OPCache は Zend によって正式に作成され、オープンされています。無料の opcode キャッシュ拡張機能にはコード最適化機能もあり、毎回 PHP スクリプトをロードして解析するオーバーヘッドを排除します。 OPcache 拡張機能は、PHP 5.5.0 以降のバージョンにバンドルされています。
2 種類のコンテンツをキャッシュします:OPCode
コメント、変数名などの内部文字列。
OPCache キャッシュの主なメカニズムは、コンパイルされたオペレーション コードを共有メモリに置き、他のプロセスへのアクセスを提供することです。これにはメモリ共有メカニズムが関係し、さらにすべてのメモリ リソース操作にはロックの問題がありますので、1 つずつ説明します。
UNIX/Linux システムには、プロセス間でメモリを共有するためのさまざまな方法が用意されています。
1.System-V shm API: System V 共有メモリ
sysv shm は、プロセスの削除によって明示的に指定されない限り永続的です。システムがシャットダウンされるまでメモリ内に常に存在します;
2.mmap API:
mmap によってマップされたメモリは永続的ではありません。プロセスがシャットダウンされると、マッピングは事前にファイルにマッピングされていない限り、直ちに無効になります。
メモリ マッピング機構 mmap は POSIX 標準のシステム コールであり、次の 2 種類があります。 匿名マッピングおよびファイル マッピング
mmap の利点の 1 つは、ファイルをプロセスのアドレス空間にマップすることです。
System V の共有メモリは時代遅れです。POSIX 共有メモリは、より使いやすく、より合理的に設計された API を提供します。
無駄なメモリが設定値より大きい場合、OPCache メカニズムが自動的に再起動され、キャッシュがクリアされて再生成されます。
共有メモリ: 単位時間内に書き込み操作を実行できるのは 1 つのプロセスのみであり、読み取り操作を実行できるのは複数のプロセスです。書き込み操作が実行されている間、読み取り操作はブロックされないため、ロックが発生することはほとんどありません。アップの状況。
これは別の問題を引き起こします: 新しいコード、大規模なトラフィックのシナリオ、プロセスはキャッシュ オペコード操作を実行するためにキューに入れられ、繰り返しの書き込みはリソースの無駄につながります。
4. OPCache キャッシュの解釈
OPCache は公式の Opcode キャッシュ ソリューションで、PHP5.5 バージョン以降は PHP ソース コードにパッケージ化され、一緒にリリースされています。PHP のコンパイルによって生成されたバイトコードとデータを共有メモリにキャッシュし、リクエストごとに、コンパイルされたオペコードがキャッシュから直接読み取られて実行されます。
スクリプトのコンパイルプロセスを省略して、PHP の実行効率を向上させます。同じジョブを実行するために APC 拡張機能を使用している場合、特に PHP7 では、代わりに OPCache を使用することを強くお勧めします。
PHP5.4 では、PHP の文字列のストレージと処理を最適化するために、Interned String メカニズムが導入されました。特に、PHP ドキュメントなどの大きな文字列ブロックを扱う場合、Interned String はメモリを最適化できます。 Interned String キャッシュの内容には、変数名、クラス名、メソッド名、文字列、コメントなどが含まれます。
PHP-FPM モードでは、インターンされた文字列キャッシュ文字はワーカー プロセス内に限定されます。 OPCache にキャッシュされている場合、Interned String のキャッシュされた文字列をワーカー プロセス間で使用してメモリを節約できます。
注意すべき点が 1 つあり、PHP 開発では通常、大きなコメントがあり、それも OPCache にキャッシュされます。 php.ini の設定を通じてコメントのキャッシュをオフにすることができます。
ただし、Zend Framework などのフレームワークではコメントが参照されるため、コメントのキャッシュをオフにするかどうかは別の扱いにする必要があります。はキャッシュであり、有効期限と更新戦略があります。 OPCache の更新戦略は非常にシンプルで、期限切れのデータは Wasted に設定され、設定値に達するとキャッシュがクリアされ、キャッシュが再構築されます。
ここで注意してください: 高トラフィックのシナリオでは、キャッシュの再構築は非常にリソースを消費するタスクです。 OPCache は、キャッシュの作成時に他のプロセスによる読み取りを妨げません。その結果、多数のプロセスが新しいキャッシュを繰り返し作成することになります。したがって、OPCache の有効期限を設定しないでください。
新しいコードがリリースされるたびに、キャッシュが繰り返し作成されます。それを避けるにはどうすればよいでしょうか?
6.1 メモリ構成
##opcache.preferred_memory_model="mmap" OPcache の優先メモリ モジュール。空白のままにすると、OPcache が該当するモジュールを選択します。通常は自動選択で十分です。オプションの値には、mmap、shm、posix、win32 が含まれます。
opcache.memory_consumption=64 OPcache 共有メモリ サイズ (メガバイト単位)、デフォルトは 64M
opcache.interned_strings_buffer=4 一時文字列の保存にメモリ サイズを使用します、メガバイト単位、デフォルトは 4M
opcache.max_wasted_percentage=5 無駄なメモリの上限 (パーセント単位)。この制限に達すると、OPcache は再起動イベントを生成します。デフォルト 5
6.2 キャッシュできるファイルの数とサイズ
opcache.max_accelerated_files=2000 保存できるスクリプト ファイル数の上限OPcache ハッシュ テーブル。実際の値は、素数セット {223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987} 内で見つかった、設定値以上の最初の素数です。設定値の最小値の範囲は 200、最大値は PHP 5.5.6 以前では 100000、PHP 5.5.6 以降では 1000000 です。デフォルト値 2000
opcache.max_file_size=0 キャッシュされたファイル サイズの上限 (バイト単位)。すべてのファイルをキャッシュするには 0 に設定します。デフォルト値 0
6.3 コメント関連のキャッシュ
opcache.load_commentsboolean 無効にすると、ファイルにコメントが含まれていてもロードされません 注釈の内容。このオプションを opcache.save_comments と一緒に使用すると、コメントのコンテンツをオンデマンドでロードできます。
opcache.fast_shutdown boolean 有効にすると、高速停止再開イベントが使用されます。いわゆるクイック停止再開イベントは、割り当てられた各メモリ ブロックを順番に解放するのではなく、Zend エンジンに依存して、要求されたすべての変数のメモリを一度に解放するメモリ管理モジュールを指します。
6.4 2 次キャッシュの構成
opcache.file_cache 2 次キャッシュ ディレクトリを構成し、2 次キャッシュを有効にします。 2 次キャッシュを有効にすると、SHM メモリがいっぱいになった場合、サーバーが再起動された場合、または SHM がリセットされた場合のパフォーマンスが向上します。デフォルト値は空の文字列「」で、ファイルベースのキャッシュが無効になります。
opcache.file_cache_onlyboolean 共有メモリ内のオペコード キャッシュを有効または無効にします。
opcache.file_cache_consistency_checksboolean ファイル キャッシュからスクリプトをロードするときにファイルのチェックサムを検証するかどうか。
opcache.file_cache_fallbackboolean Windows プラットフォームでは、プロセスが共有メモリに接続できない場合、ファイルベースのキャッシュ、つまり opcache.file_cache_only=1 が使用されます。ファイル キャッシュは明示的に有効にする必要があります。
推奨学習: 「PHP ビデオ チュートリアル 」
以上がPHP opcacheの原理と使い方を詳しく説明した記事の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。