ホームページ  >  記事  >  バックエンド開発  >  PHP Opcache の仕組みの詳細な分析

PHP Opcache の仕組みの詳細な分析

藏色散人
藏色散人転載
2022-01-05 14:01:444218ブラウズ

PHP プロジェクト、特に同時実行性が高くトラフィックが大きいシナリオでは、PHP の応答時間をいかに改善するかが非常に重要なタスクです。

Opcache は、特に PHP フレームワークを適用するプロジェクトにおいて、PHP のパフォーマンスを最適化するために不可欠なコンポーネントです。

1. 概要

OPCache 関数を理解する前に、まずPHP-FPM を理解する必要があります。 Nginx の動作メカニズム、および PHP スクリプトの解釈と実行のメカニズム。

1.1 PHP-FPM Nginx の動作メカニズム

リクエストは Web ブラウザから Nginx に送られ、その後 PHP 処理に送られます。全体のプロセスは次のとおりです。 5 つのステップ:

ステップ 1: サービスの開始

  • PHP-FPM を開始します。 PHP-FPM は、TCP ソケットと Unix ソケットの 2 つの通信モードをサポートします。
  • PHP-FPM は 2 種類のプロセスを開始します: マスター プロセス前者はポートの監視、タスクの割り当て、ワーカー プロセスの管理を担当し、後者は PHP CGI プログラムで、PHP スクリプトの解釈、コンパイル、実行を担当します。
  • Nginx を起動します。 まず、ngx_http_fastcgi_module モジュールがロードされて、FastCGI 実行環境を初期化し、FastCGI プロトコル リクエスト プロキシを実装します。
  • ここで注意してください: fastcgi ワーカー プロセス (cgi プロセス) は、によって管理されます。 PHP-FPM。Nginx ではありません。 Nginx は単なるプロキシです

第 2 ステップ: リクエスト => Nginx

  • Nginx はリクエストを受信し、場所に基づいて適切なハンドラを選択します設定
  • これはプロキシ PHP のハンドラーです

##3 番目のステップ: Nginx => PHP-FPM

    Nginxリクエストを変換します Fastcgi request
  • TCP ソケット/Unix ソケット経由で PHP-FPM マスター プロセスに送信します

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

    PHP-FPM マスター プロセスがリクエストを受信します
  • PHP スクリプトを実行するワーカー プロセスを割り当てます。
  • アイドル状態のワーカーがない場合、502 エラーが発生します戻り値
  • ワーカー (php-cgi) プロセスが PHP スクリプトを実行します。
  • タイムアウトになると、504 エラーが返されます #処理が完了し、結果が返されます
ステップ 5: PHP-FPM ワーカー => マスター => Nginx

PHP-FPMワーカープロセスは処理結果を返し、コネクションを閉じる次のリクエストを待つ
  • PHP-FPMマスタープロセスはSocket経由で処理結果を返す
  • Nginxハンドラーはそれぞれを順次送信最初のフィルタへの応答バッファ → 2 番目 → というように → 最後に 応答がクライアントに送信されます
#1.2 PHP スクリプトの説明と実行の仕組み

#PHP Nginx の全体的な処理の流れを理解したら、次は PHP スクリプトの具体的な実行プロセスを見てみましょう。##最初に例を見てみましょう:

えええええ

実行プロセスを分析してみましょう:

  • php は実行リンクを初期化し、Zend エンジンを開始します、登録された拡張モジュールをロードします

  • 初期化後、スクリプト ファイルが読み取られ、Zend エンジンはスクリプト ファイルに対して字句解析 (lex)、構文解析 (bison) を実行し、構文ツリー

  • Zend エンジンが構文ツリーをコンパイルし、オペコードを生成します#、

  • Zend エンジンオペコードを実行#、実行結果を返す

  • #PHP cli モードでは、PHP スクリプトが実行されるたびに、 4 つのステップが順番に実行されます。

PHP-FPM モードでは、ステップ 1) は PHP-FPM の開始時に 1 回実行され、後続のリクエストでは実行されません。ステップ 2) ~4) はリクエストごとに 1 回実行する必要があります実際、ステップ 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 によって公式に作成されたオープンで無料のオペコード キャッシュ拡張機能であり、コード最適化機能も備えており、毎回の PHP スクリプトの読み込みと解析のオーバーヘッドを排除します。

OPcache 拡張機能は、PHP 5.5.0 以降のバージョンにバンドルされています。

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

OPCode
  • コメント、変数名などの内部文字列。
  • # #3. OPCache の原理

#OPCache キャッシュの主なメカニズムは次のとおりです:#コンパイルされたオペレーション コードを共有メモリに置き、他のプロセスにアクセスできるように提供します## #。

これにはメモリ共有メカニズムが関係します。また、すべてのメモリ リソース操作にはロックの問題があります。1 つずつ説明します。 3.1 共有メモリ

UNIX/Linux システムには、プロセス間でメモリを共有するためのさまざまな方法が用意されています。 -V shm API: System V 共有メモリ、sysv shm は永続的です。プロセスによって明示的に削除されない限り、システムがシャットダウンされるまで常にメモリ内に存在します;

mmap API:

    mmap によってマッピングされたメモリは永続的ではありません。事前にファイルにマッピングされていない限り、プロセスが閉じられるとマッピングは無効になります。メモリ マッピング メカニズム mmap は POSIX 標準システム コールです。匿名マッピングとファイル マッピングの 2 つのタイプがあります。
    • mmap の大きな利点の 1 つは、ファイルをプロセスのアドレス空間にマッピングすることです。
    • データをユーザー バッファからカーネル ページ キャッシュ バッファのコピー プロセスに転送する必要がなくなります。
  • もちろん、もう 1 つの利点は、頻繁な読み取り/書き込みシステム コールが必要ないことです
    • #POSIX API: System V 共有メモリは時代遅れです。POSIX 共有メモリは、より使いやすく、より合理的に設計された API を提供します。
    • Unix ソケット API
    • OPCache は、構成またはデフォルトの mmap メモリ共有モードに応じて、最初の 3 つの共有メモリ メカニズムを使用します。
    • PHP バイトコード キャッシュのシナリオに基づいた OPCache のメモリ管理設計は非常にシンプルで、読み取りと書き込みが高速で、メモリ解放がなく、期限切れのデータは無駄に設定されます。
  • 無駄なメモリが設定値より大きい場合、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 キャッシュされた文字列は、ワーカー プロセス間で使用してメモリを節約できます。

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 が該当するモジュールを選択します。通常は自動選択で十分です。オプションの値には、
  • mmapshmposix、および win32 が含まれます。 opcache.memory_consumption=64
  • OPcache の共有メモリ サイズ (メガバイト単位、デフォルト)
  • 64M#opcache.interned_strings_buffer =4一時文字列の保存に使用されるメモリ サイズ (メガバイト単位)、デフォルト
  • 4M
  • ##opcache.max_wasted_percentage=5 無駄なメモリの上限 (パーセント単位)。この制限に達すると、OPcache は再起動イベントを生成します。デフォルト
  • #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 です。デフォルト値 2000opcache.max_file_size=0 キャッシュされたファイルの最大サイズ (バイト単位)。すべてのファイルをキャッシュするには 0 に設定します。デフォルト値 0
  • 6.3 コメント関連キャッシュ

opcache.load_comments

boolean
    無効にすると、ファイルにコメントが含まれていても、コメントの内容は読み込まれません。このオプションを
  • opcache.save_comments と組み合わせて使用​​すると、コメントのコンテンツをオンデマンドで読み込むことができます。 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 サイトの他の関連記事を参照してください。

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