PHPプロジェクトは、特に高い同時実行シナリオの大きな流れの中で、応答時間を改善するためにどのようにPHPは、非常に重要な仕事です。
OpcacheはPHPコンポーネントの性能は、プロジェクトのPHPフレームワークの特にアプリケーション、欠落することができない最適化することで、効果はより明白です。
1.概要
OPCache機能を理解する前に、まずPHP-FPM + nginxの作業メカニズムだけでなく、PHPスクリプトインタプリタの実装のメカニズムを理解する必要があります。
1.1 PHP-FPM + nginxの作業メカニズム
Nginxは、PHPのWebブラウザからの要求、その後の処理は、合計は、次の5つのステップが含まれ、完了です。
最初のステップ:サービスの開始
-
[スタート] PHP-FPM。PHP-FPMは、2つの通信モードをサポート:TCPソケットとUnixソケットを。
-
ワーカープロセスを管理、マスターワーカープロセスとプロセス、ポート、割り当てタスクを監視するための元責任者、後者はコンパイルを解釈し、PHPスクリプトを実行する責任PHP-CGIプログラム、次のとおりです。PHP-FPMは、2つのプロセスの種類を起動します。
-
スタートnginxの。すべての負荷ngx_http_fastcgi_moduleモジュール、FastCGIの初期化実行環境のまず、FastCGIのプロトコル・リクエスト・ブローカーを達成するために
-
ここでは、注意する必要があります。ワーカープロセス(CGIプロセス)のFastCGIのが、PHP-FPM、ないnginxのによって管理されています。nginxのプロキシだけ
ステップ2:要求=> nginxの
-
nginxのは、要求を受信し、位置に基づいた構成は、適切なハンドラを選択します
-
ここではPHPハンドラの薬剤であります
第三段階:nginxの=> PHP-FPM
-
nginxののFastCGIの要求は、要求に翻訳しました
-
TCPソケット/ Unixのソケット経由でPHP-FPMのプロセスを習得するために送ります
ステップ4:PHP-FPMマスター=>ワーカー
-
PHP-FPMマスター・プロセスは、要求を受信します
-
アイドルワーカーが存在しない場合、作業者割当処理は502エラーを返し、PHPスクリプトを実行します
-
ワーカー(PHP-CGI)PHPスクリプト実行処理、タイムアウトは、504エラーを返す場合
-
処理が終了し、リターン結果
ステップ5:PHP-FPMワーカー=>マスター=> nginxの
-
PHP-FPMワーカー戻り結果を処理し、次のリクエストを待つために、接続を閉じます
-
ソケットを介して処理結果にPHP-FPMマスター処理に戻ります
-
nginxのハンドラを順次第二のフィルタ→→→に応答して第1のバッファのそれぞれに送信され、最終的な応答がクライアントに送信されます
実行の仕組みを説明するための1.2のPHPスクリプト
PHP + nginxの全体的なプロセスフローの理解、我々は特定のPHPスクリプトの実行プロセスにおける次の一見、最初に私たちは例を見て:
<?php
if (!empty($_POST)) {
echo "Response Body POST: ", json_encode($_POST), "\n";
}
if (!empty($_GET)) {
echo "Response Body GET: ", json_encode($_GET), "\n";
}
私たちは、実装プロセスを分析します:
-
phpのリンク初期化の実行、Zendのエンジン負荷登録拡張モジュールを開始
-
初期化スクリプトを読んだ後、Zendのエンジンスクリプトファイル字句解析(LEX)、(バイソン)を解析し、生成文法ツリー
-
Zendのエンジンコンパイル構文木、生成されたオペコード、
-
Zendのエンジンは、オペコードを実行し、結果を返します
PHP CLIモードでは、PHPスクリプトの各実行は、4つのステップを順次再び行われます。
PHP-FPMモード、工程1)でPHP-FPMを起動した場合、後続の要求は実行されずに行われる、ステップ2)〜4)すべてのリクエストを再度実行。
実際には、ステップ2)、3)結果の構文木とオペコードは、同じ結果があなたがPHPスクリプトを実行するたびに同じであり、
PHP-FPMモードでは、各要求は再び処理されなければならない、システムリソースの偉大な廃棄物である、それを最適化する方法はありませんか?
もちろん、例えば:
-
OPCache:以前のZendオプティマイザ+として知られているが、Zendのサーバーのオープンソースコンポーネントである公式を作製し、強く推奨します
-
APC:オルタナティブPHPキャッシュはPHPの中間コードを最適化し、キャッシュするため、オープンで自由なPHPのオペコードキャッシュコンポーネントであり、更新されていませんが推奨されていません
-
APCuは:オペコードのキャッシュは、Opcacheで使用することはできませんAPCのブランチ、共有メモリ、ユーザ・データ・キャッシュであり、
-
eAccelerate:同じが更新されず、推奨されません
-
XCacheと:もはや使用をお勧めします
2. OPCacheはじめに
OPCacheまた、各負荷と解析PHPスクリプトのオーバーヘッドを排除し、コードの最適化機能を持っている、Zendの公式、オープンで自由なオペコードキャッシュの拡張機能を作成します。
PHP 5.5.0以降のバージョンでは、すでにOPcache拡張を結合しました。
コンテンツのキャッシュの種類:
-
オペコード
-
などのコメント、変数名、などインターン文字列、
3. OPCache原則
OPCacheキャッシング機構は主に:共有メモリにコンパイルされた操作コード、他のプロセスへのアクセスを提供します。
ここでの操作はロックの問題を持っているすべてのメモリリソースに加えて、メモリ共有メカニズムが関与する、我々は暗唱します。
3.1共有メモリ
UNIX / Linuxシステムは、プロセス間のメモリ共有方法を数多く提供しています:
-
システム-V SHM API:システムVは、メモリを共有しました
-
SysVのSHMは、システムがシャットダウンされるまで、それ以外の場合は、常にメモリ内に存在する、明示的にプロセスを削除しない限り、永続的です。
-
-
mmap API:
-
すでにファイルにマップされた上でない限りはmmapは、マッピングの失敗、プロセスが閉じている場合、メモリは、永続的ではないマッピングされました
-
MMAPメモリマッピングメカニズムは、標準のPOSIXシステムコールで、匿名のファイルマッピングおよびマッピングの2種類があります
-
主な利点は、プロセスのアドレス空間にファイルをマップすることはmmapです
-
ページキャッシュバッファバッファカーネルへのユーザーからのプロセスをコピーしたデータを避けます。
-
もちろん、頻繁に読み取り/書き込みシステムコールを必要としないという利点があります
-
-
POSIXのAPI:System V共有メモリが廃止され、POSIXは、メモリがAPIのよりシンプルで合理的な設計を提供する共有。
-
UnixソケットAPI
最初の三つOPCacheは、デフォルト設定に従い、メモリ機構を共有またはメモリモードを共有MMAP使用。
シーンに基づいたPHPバイトコードキャッシュ、OPCacheメモリ管理の設計は非常に単純である、高速な読み取りおよび書き込みは、無駄期限切れになるように、データセットをメモリを解放しません。
無駄なメモリは、キャッシュを空にして再生成し、設定値、自動再起動メカニズムOPCacheよりも大きい場合。
3.2ミューテックス
任意のメモリリソースの操作がロックの機構に関連しています。
共有メモリ:時間の単位は、唯一の読み出し動作を実行する複数のプロセスを可能にする、書き込み動作を実行するためのプロセスを可能にします。
同時に書き込み操作は、デッドロックのいくつかの例があるように、読み出し動作を停止しないでください。
これは別の問題を提起:新しいコード、プロセス実行キューバッファオペコード操作、シナリオを流し、繰り返し書かれ、資源の浪費になります。
高度なPHPの建築家>>>ビデオ、インタビューのドキュメントの無料アクセスdocs.qq.com
4. OPCacheキャッシュ読み取り
OPCacheはPHP5.5バージョンの後、一緒に配布PHPソースコードにパッケージされた、公式のオペコード・キャッシュ・ソリューションです。
PHPは、すべての要求で共有メモリにコンパイルされたバイトコードとデータ・キャッシュを生み出すキャッシュコンパイルオペコードから直接読み取る、実行されます。
スクリプトのコンパイルプロセスを保存することにより、PHPの効率を向上させます。
あなたはAPC拡張を使用している場合は、同じ仕事をして、今を強くお勧めしますOPCache特にPHP7で、交換します。
4.1オペコードキャッシュ
Opcacheキャッシュオペコード以下同様に:
-
関連する関数のPHPスクリプト
-
クラスで定義されたPHPスクリプト
-
PHPスクリプトファイルのパス
-
PHPスクリプトOPArray
-
PHPスクリプト自体の構造/コンテンツ
4.2インターン文字列キャッシュ
まず、我々は、インターンの文字列であるかを理解する必要がありますか?
PHP5.4にするときのストレージのための最適化PHPへ抑留文字列の仕組みを導入し、文字列を処理します。
そのようなPHPのdocesとして文字列の大部分を扱う場合は特に、インターン文字列のメモリを最適化することができます。
インターン文字列のキャッシュの内容が含まれます:変数名、クラス名、メソッド名、文字列、コメント、上のように。
PHP-FPMモードでは、インターン文字列の文字のキャッシュは内部ワーカー・プロセスに限定されています。
キャッシュされたOPCacheは、その後、あなたはメモリを節約し、ワーカープロセス間のインターン文字列バッファを使用することができます。
私たちは、一般的にはPHP開発の事に注意を払う必要があり、コメントの大部分があるだろうOPCacheにキャッシュされます。
php.iniの設定により、キャッシングのコメントをオフにします。
しかし、Zend Frameworkのと他のフレームワーク、リファレンスノートのようにので、コメントのキャッシュをクローズするかどうかを異なる方法で処理する必要があります。
5. OPCache更新ポリシー
キャッシュは、有効期限が切れ、更新戦略があります。
OPCache更新戦略は、データセットが無駄期限切れになるように、設定値に達すると、キャッシュはキャッシュを再構築空にする非常に簡単です。
なお:高トラフィックのシーンでは、キャッシュを再構築することは非常に資源集約的なものです。
キャッシュを作成するときにOPCacheは、他のプロセスが読んで防ぐことはできません。
このプロセスが繰り返され、新たなキャッシュの多くにつながります。だから、有効期限を設定しないでくださいOPCache
あなたは新しいコードを公開するたびに、繰り返しキャッシュの新しいケースが表示されます。それを避けるためにどのように?
-
の規則を守らねばならないどのような場合であり、そのピーク、でコードを公開しないでください
-
公開され、このようなチューニングアクセスURLにPHPスクリプトを使用して、コードを予熱、または使用OPCacheのAPI
opcache_compile_file()
コンパイルキャッシュ
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 }
第1の設定値よりも大きいが素数に等しい見出さ。設定された範囲内の最小値である200
最大値は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.save_comments
、オンデマンドロード注釈コンテンツを達成するために一緒に使用します。 -
opcache.fast_shutdown
boolean型の場合は、すぐにイベントの更新を停止するために使用される、有効。いわゆるクイック停止イベントは、最初に、各割り当てられたメモリブロックを解放するために要求されたすべての変数のメモリではなく、順番にリリースのZend Engineのメモリ管理モジュールの更新に依存しています。
6.4二次キャッシュの設定
-
opcache.file_cache
二次キャッシュディレクトリを設定し、L2キャッシュを有効にします。二次キャッシュメモリは、SHM、サーバーの再起動中に充填することができる有効にするか、パフォーマンスを改善するためのSHMの時間をリセットします。デフォルト値は空の文字列で""
、無効にファイルベースのキャッシング。 -
opcache.file_cache_only
boolean
共有メモリ内のオペコードキャッシュを有効または無効にします。 -
opcache.file_cache_consistency_checks
boolean
スクリプトは、検証のためのチェックサムファイルかどうか、ファイルキャッシュからロードされたとき。 -
opcache.file_cache_fallback
boolean
ファイルベースのキャッシュを使用する場合のプロセス、すなわち、共有メモリにアタッチすることはできませんWindowsプラットフォームで、:opcache.file_cache_only=1
。キャッシュを表示するファイルを有効にします。
私は含めて、いくつかの情報をまとめたヘルプ皆、多くのPHPer常により多くのビジネスコードに方向音痴を書きません、私は上昇を開始する場所を知らない、高度な時間にいくつかの問題やボトルネックが発生し、に希望上記これらに限定されない:分散アーキテクチャ、拡張性の高い、高性能、高同時実行、サーバーのパフォーマンスチューニング、TP6、laravel、YII2、Redisの 、Swoole、Swoft、カフカ、MySQLの最適化、シェルスクリプト、ドッカー、マイクロサービス、nginxの、など高度な乾燥品のために必要な、より高度な知識は、共有への皆のために自由にすることができます
入手先:
-
次Fangerウェイコードスキャン、キーワード舞台裏返信
-
または 列車にはこちらをクリック 電車2