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

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

Mar 22, 2023 pm 04:18 PM
php opcache

この記事では、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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles