ホームページ  >  記事  >  バックエンド開発  >  PHP opcacheの原理と使い方を詳しく説明した記事

PHP opcacheの原理と使い方を詳しく説明した記事

藏色散人
藏色散人転載
2023-03-22 16:18:452065ブラウズ

この記事では、PHP opcache に関する関連知識をお届けします。主に OPCache 関数の理解方法と使用方法について説明します。興味のある友人は一緒に見てください。皆さんのお役に立てれば幸いです。

PHP 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

  • Nginx はリクエストを fastcgi リクエストに変換します

  • TCP ソケット経由で PHP-FPM のマスター プロセスに送信します。 Unix ソケット

ステップ 4: PHP-FPM マスター => ワーカー

  • PHP-FPM マスター プロセスは、 request

  • PHP スクリプトを実行するワーカー プロセスを割り当てます。アイドル状態のワーカーがない場合は、502 エラーが返されます。ワーカー (php-cgi) プロセスが PHP スクリプトを実行します。タイムアウトになると、504 エラーが返されます。

  • #処理が終了し、結果が返されます。
  • #ステップ 5: PHP-FPM ワーカー => マスター => ; Nginx
PHP-FPM ワーカー プロセスは処理結果を返し、接続を閉じ、次の接続を待ちます。 request

PHP-FPM マスター プロセスは Socket を通じて処理結果を返します
  • Nginx ハンドラーは各応答バッファを順番に最初のフィルターに送信します → 2 番目 → など → 最終応答がクライアントに送信されます
  • 1.2 PHP スクリプトの解釈と実行の仕組み
  • PHP の全体的な処理の流れを理解した上でNginx では、PHP スクリプトの具体的な実行フローを見てみましょう。まず、例を見てみましょう:

    <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:

  • #2 の使用は推奨されなくなりました。OPCache の概要
  • OPCache は Zend によって正式に作成され、オープンされています。無料の opcode キャッシュ拡張機能にはコード最適化機能もあり、毎回 PHP スクリプトをロードして解析するオーバーヘッドを排除します。 OPcache 拡張機能は、PHP 5.5.0 以降のバージョンにバンドルされています。

    2 種類のコンテンツをキャッシュします:

OPCode


コメント、変数名などの内部文字列。

  • 3. OPCache の原理
  • OPCache キャッシュの主なメカニズムは、コンパイルされたオペレーション コードを共有メモリに置き、他のプロセスへのアクセスを提供することです。これにはメモリ共有メカニズムが関係し、さらにすべてのメモリ リソース操作にはロックの問題がありますので、1 つずつ説明します。

  • 3.1 共有メモリ

UNIX/Linux システムには、プロセス間でメモリを共有するためのさまざまな方法が用意されています。

1.System-V shm API: System V 共有メモリ
sysv shm は、プロセスの削除によって明示的に指定されない限り永続的です。システムがシャットダウンされるまでメモリ内に常に存在します;
2.mmap API:

  • mmap によってマップされたメモリは永続的ではありません。プロセスがシャットダウンされると、マッピングは事前にファイルにマッピングされていない限り、直ちに無効になります。

  • メモリ マッピング機構 mmap は POSIX 標準のシステム コールであり、次の 2 種類があります。 匿名マッピングおよびファイル マッピング

  • mmap の利点の 1 つは、ファイルをプロセスのアドレス空間にマップすることです。

  • ##MMAP のコピー プロセスを回避できることです。ユーザー バッファからカーネル ページ キャッシュ バッファへのデータ;

  • もちろん、もう 1 つの利点は、頻繁な読み取り/書き込みシステム コールが必要ないことです

3.POSIX API:

System V の共有メモリは時代遅れです。POSIX 共有メモリは、より使いやすく、より合理的に設計された API を提供します。

4.Unix ソケット API

OPCache は、構成またはデフォルトの mmap メモリ共有モードに応じて、最初の 3 つの共有メモリ メカニズムを使用します。 PHP バイトコード キャッシュのシナリオによれば、OPCache のメモリ管理設計は非常にシンプルで、読み取りと書き込みが高速で、メモリの解放がなく、期限切れのデータは「Wasted」に設定されます。

無駄なメモリが設定値より大きい場合、OPCache メカニズムが自動的に再起動され、キャッシュがクリアされて再生成されます。

3.2 ミューテックス ロック

メモリ リソースの操作にはロック メカニズムが関係します。

共有メモリ: 単位時間内に書き込み操作を実行できるのは 1 つのプロセスのみであり、読み取り操作を実行できるのは複数のプロセスです。書き込み操作が実行されている間、読み取り操作はブロックされないため、ロックが発生することはほとんどありません。アップの状況。
これは別の問題を引き起こします: 新しいコード、大規模なトラフィックのシナリオ、プロセスはキャッシュ オペコード操作を実行するためにキューに入れられ、繰り返しの書き込みはリソースの無駄につながります。

4. OPCache キャッシュの解釈

OPCache は公式の Opcode キャッシュ ソリューションで、PHP5.5 バージョン以降は PHP ソース コードにパッケージ化され、一緒にリリースされています。

PHP のコンパイルによって生成されたバイトコードとデータを共有メモリにキャッシュし、リクエストごとに、コンパイルされたオペコードがキャッシュから直接読み取られて実行されます。
スクリプトのコンパイルプロセスを省略して、PHP の実行効率を向上させます。同じジョブを実行するために APC 拡張機能を使用している場合、特に PHP7 では、代わりに OPCache を使用することを強くお勧めします。

4.1 OPCode

キャッシュ Opcache は、OPCode と次のコンテンツをキャッシュします:

  • PHP スクリプトに関連する関数

  • PHP スクリプトで定義されたクラス

  • PHP スクリプト ファイルのパス

  • PHP スクリプト OPArray

  • #PHP スクリプト自体の構造/コンテンツ
  • 4.2 インターンされた文字列

キャッシュまず、インターンされた文字列とは何なのかを理解する必要があります。

PHP5.4 では、PHP の文字列のストレージと処理を最適化するために、Interned String メカニズムが導入されました。特に、PHP ドキュメントなどの大きな文字列ブロックを扱う場合、Interned String はメモリを最適化できます。 Interned String キャッシュの内容には、変数名、クラス名、メソッド名、文字列、コメントなどが含まれます。
PHP-FPM モードでは、インターンされた文字列キャッシュ文字はワーカー プロセス内に限定されます。 OPCache にキャッシュされている場合、Interned String のキャッシュされた文字列をワーカー プロセス間で使用してメモリを節約できます。

注意すべき点が 1 つあり、PHP 開発では通常、大きなコメントがあり、それも OPCache にキャッシュされます。 php.ini の設定を通じてコメントのキャッシュをオフにすることができます。

ただし、Zend Framework などのフレームワークではコメントが参照されるため、コメントのキャッシュをオフにするかどうかは別の扱いにする必要があります。


5. OPCache 更新戦略

はキャッシュであり、有効期限と更新戦略があります。 OPCache の更新戦略は非常にシンプルで、期限切れのデータは Wasted に設定され、設定値に達するとキャッシュがクリアされ、キャッシュが再構築されます。

ここで注意してください: 高トラフィックのシナリオでは、キャッシュの再構築は非常にリソースを消費するタスクです。 OPCache は、キャッシュの作成時に他のプロセスによる読み取りを妨げません。その結果、多数のプロセスが新しいキャッシュを繰り返し作成することになります。したがって、OPCache の有効期限を設定しないでください。


新しいコードがリリースされるたびに、キャッシュが繰り返し作成されます。それを避けるにはどうすればよいでしょうか?

    ピーク期間中にコードをリリースしないでください。これは、いかなる状況でも従う必要があるルールです。
  • コードのウォームアップなどスクリプトのバッチ デバッグを使用する場合、PHP は URL にアクセスするか、コンパイルとキャッシュに opcache_compile_file() などの OPCache によって公開される API を使用します
  • #6. 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 サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.imで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。