【modernPHP特集(13)】ZendOpcacheバイトコードキャッシュ

2934 ワード

概要
バイトコードキャッシュはPHPの新しい特性ではなく、APC、eAccelerator、Xacheなどの独立した拡張が実現できることが多いが、これまでこれらの拡張はPHPコアに統合されておらず、PHP 5.5.0からPHPにはバイトコードキャッシュ機能が内蔵されており、Zend Opcacheと呼ばれている.
最初に、バイトコードキャッシュとは何か、バイトコードキャッシュの役割とは何かを見てみましょう.
周知のように、PHPは解釈型言語であり、Zend仮想マシン上に構築され、PHP解釈器はPHPスクリプトを実行する際にPHPスクリプトコードを解析し、PHPコードを一連のZendオペレーティングコード(opcode、各オペレーティングコードは1バイト長であるため、バイトコードとも呼ばれ、バイトコードはZend仮想マシンによって直接実行されることができる)にコンパイルし、バイトコードを実行する.PHPファイルを要求するたびに、これは多くのリソースを消費し、HTTP要求のたびにPHPスクリプトを解析、コンパイル、実行しなければならない場合は、より多くのリソースを消費します.PHPソースコードが変わらなければ、対応するバイトコードも変化しないので、毎回Opcodeを再生成する必要はありません.Webアプリケーションにどこにでもあるキャッシュメカニズムと組み合わせて、初めて生成したOpcodeをキャッシュすることができます.そうすれば、次回直接キャッシュから取り出すことができます.次に、Opcodeキャッシュを有効にする前と後のフローチャートを示します.
バイトコードキャッシュは、予めコンパイルされたPHPバイトコードを記憶することができ、このように、次回PHPスクリプトを要求する場合、PHP解釈器は、PHPコードの読み取り、解析、コンパイルのたびに、メモリから予めコンパイルされたバイトコードを直接読み取る必要がなく、直ちに実行することができ、多くの時間を節約し、アプリケーションの性能を極めて向上させることができる.
Zend Opcacheの有効化
注意:Windows開発環境を使用している場合や、brewやapt-getなどのコマンドでインストールされているPHPは、コンパイル手順を省略できます.
デフォルトでは、Zend Opcacheはオンになっていません.コンパイル時に--enable-opcacheを使用してZend Opcacheの有効化を指定する必要があります.
PHPをコンパイルしたらphpが必要です.iniでOpcache拡張パスを指定します.
zend_extension=/path/to/opcache.so

一般的にPHPコンパイルに成功するとZend Opcache拡張パスが表示されますが、思い出せない場合は、次のコマンドを使用してPHP拡張が存在するディレクトリを見つけることができます.
php -ini | grep extensions

[info]注:Xdebugを使用する場合はphp.iniにZend Opcacheをロードし、Xdebugをロードします.
再起動後、phpinfoを表示
php -info | grep Opcache


Zend Opcacheの構成
Zend Opcacheを有効にするにはphpが必要です.IniではZend Opcacheを構成していますが、以下は構成例を参照してください.
opcache.validate_timestamps=1    //         0
opcache.revalidate_freq=0    //              
opcache.memory_consumption=64    //Opcache       , M   
opcache.interned_strings_buffer=16    //              , M   
opcache.max_accelerated_files=4000    //Opcache                
opcache.fast_shutdown=1         //          


公式サイト
Zend Opcacheの使用
Zend Opcacheは、有効にすると自動的に実行されるため、事前にコンパイルされたPHPバイトコードがメモリに自動的にキャッシュされ、ファイルのバイトコードがキャッシュされている場合は対応するバイトコードが実行されます.
php.iniにはopcacheが配置する.validate_timestamps値は0です.Zend OpcacheはPHPスクリプトの変化に気づかないので、PHPファイルの変動を発見するにはZend OPcacheキャッシュのバイトコードを手動で空にする必要があります.この構成は、本番環境で0に設定するのに適していますが、開発環境では不便です.開発環境では、自動検証キャッシュ機能を有効にするように構成できます.
opcache.enable=1 #        ,   “1”,        ,          。
opcache.revalidate_freq=0 #                 ,     。    0          , OPcache         。
opcache.validate_timestamps=1 #     ,   OPcache     opcache.revalidate_freq               。


キャッシュの手動クリーンアップ
php-fpmを再起動するプロセスでopcacheキャッシュをクリーンアップできるほか、手動クリーンアップキャッシュに関連するopcache関数は主にopcache_reset()とopcache_invalidate() .
boolean opcache_reset ( void ) #              。     opcache_reset()   ,                          。


[warning]PHPがPHP-FPMで動作する場合、opcacheのキャッシュはphpコマンドでクリアできず、httpまたはcgiからphp-fpmプロセスでのみキャッシュをクリアできることに注意してください.