PHP8より実装されているJITを有効化する方法です。
2020年の11月にリリースされたPHP8の目玉ともいえる機能がJITで、有効化することでPHPの処理をさらに高速化することができます。
この記事ではJITの有効化方法とその設定値についてをまとめています。
JITはPHP8以上で、php.iniなどに設定値を書くことで有効化できます。
この記事の目次
PHPのJITを有効化する方法
PHP8から新しく実装された機能の「JIT (ジャストインタイム) コンパイル」、通称JITを有効化することで、PHP7に比べて大幅な高速化が狙えます。
既にご存じかと思いますが、JITはOPcacheの拡張機能で、プログラムのキャッシュを保持しておき、これを使いまわすことでPHPをさらに高速化する仕組みです。
OPcacehはPHP7でも使えますが、JITの機能はこれを更に高速化できる感じです。
このところPHP8以上で使えるJITコンパイラについて色々勉強しているので、備忘録がてらJITの有効化方法とJITの主要設定値を忘れないうちにまとめておきます。
PHP8がリリースされてしばらく経ち、多くのレンタルサーバー各社でもPHP8の安定バージョンが使用できるようになっているので、まだJITを試していない方は当記事を参考に有効化を検討してみて下さい!
JITはphp.iniを編集して有効化する
JITコンパイラを使いたい場合、大前提としてPHPのバージョンが8以上であることが必須です。なのでまずはサーバーのPHPを8.x以上に変更しておきます。
続いて、FTPソフトなどを使いサーバー上の「php.ini」を編集します。
基本的には公開ディレクトリ(public_html)直下にある「php.ini」を編集すればOKですが、共有サーバーなら「.user.ini」を編集することになるかもしれません。
参考
少し試したところ「php.ini」と「.user.ini」のどちらが優先されるかはサーバー環境で異なるようです。両方ある場合は効く方を編集すればOKです。
そして、JITを有効化するには「php.ini」または「.user.ini」に以下のコードを追記すればOKです。分かりやすいように最終行あたりに追記しておくと良いです。
[opcache] zend_extension=opcache opcache.enable=1 opcache.enable_cli=1 opcache.memory_consumption=128 opcache.max_accelerated_files=10000 opcache.jit = tracing opcache.jit_buffer_size = 128M
各設定値(ディレクティブ)については後述します。
デフォルト値などを考慮するならこんなに書かなくても有効化できますが、一応JITに関する主要項目を全て書いているので、JIT有効化のテンプレ的なコードです。
PHPのバージョンが8以上なら上記のコードでJITを有効化できるはずです。
なおPHP7以前で書いた場合は、不明な設定値は無視されるためエラーは吐きません。
ポイント
「Xdebug」を使っているとJITが有効化できないらしいので注意です。
JITが有効になっているか確認する方法
JITを有効化したら、本当にJITが有効化されたか確認しましょう。
共有サーバーなら大体PHP-FPMを使っていると思うので、5分ほど待ってからJITが有効になったか確認します。(user_ini.cache_ttlのデフォルト設定は300秒)
専用サーバーやローカルサーバーの場合はApacheを再起動してから確認します。
JITの有効化確認にはphpinfoを使う方法がおすすめです。
phpinfoを作って開いたら、OPcacheの項目で以下の2点を確認しましょう。
- JITが「On」になっているか?
- opcache.jit_buffer_sizeの値が「0」になっていないか?
JITの項目がOnになっていても、Local Value側のopcache.jit_buffer_sizeの値が0だとバッファー領域がなく、実質JITは機能しないので注意です。
OKですね!無事にJITが有効化できました。
phpinfoの作り方や確認方法が分からない人は以下も参考にどうぞ。
phpinfo以外のJIT動作確認方法
JITの動作確認には以下のようなコードを実行しても良いのですが、これだとJITさえ読み込まれていればEnableになります。つまりopcache.jit_buffer_sizeの値が0で実質JITが機能していなくてもEnableになってしまうので気を付けましょう。
<?php echo (function_exists('opcache_get_status') && opcache_get_status()['jit']['enabled']) ? 'JIT enabled' : 'JIT disabled'; ?>
また、マンデルブロ集合の計算のようなベンチマークプログラムをテストすれば、JITの有効化で目に見えて処理結果が速くなるのでそういう方法で有効化確認を行っても良いかもです。
JITの主要設定値(ディレクティブ)について
最後にJITに関する主要設定値(ディレクティブ)を備忘録がてらまとめておきます。
ディレクティブ値については以下のphpの公式ページにも載っています。
外部リンク
JITに関する設定値については、ほとんどがデフォルト値で問題ない状態になっていますが「opcache.jit_buffer_size」だけはデフォルト値が0なので注意が必要です。
つまり、PHP8のデフォルト状態ではJITが実質殺されている状態ということです。
では順番に見ていきましょう・w・
zend_extension=opcache
zend_extensionにOPcacheの拡張モジュールの場所を指定する。
ファイル名に「opcache」と「opcache.so」があり、調べてみたのですが何が違うのかよく分かりませんでした...。
「Zend Optimizer」を使いたい時は「opcache.so」。
「Zend Opcache」を使う時は「opcache」という感じなのかな?
opcache.enable=1
オペコード・キャッシュを有効にする。
デフォルト値は「1」なので記述していなくても機能する。
opcache.enable_cli=1
PHPのCLI版に対してオペコード・キャッシュを有効にする。デフォルト値は「0」。
共有サーバーの場合は上層(Master Value)の設定値でoffになっていることもありますが、この場合もJITは使えます。
opcache.memory_consumption
OPcacheで使用される共有メモリ、ストレージのサイズ。
単位は「MB」で、デフォルト値は「128MB」、最小値は「8」。
こだわりが無ければデフォルトの128MBで十分、なので別に記述しなくてもOK。
opcache.max_accelerated_files
OPcacheのスクリプトの最大数。設定は200~1000000まで。
デフォルト値である「10000」で十分な様子なので、記述しなくてもOK。
実際JITのベンチマークでエラーは出ませんでした。
上記はOPcacheに関する設定値でしたが、ここからはJITに関する設定値です。
opcache.jit
JITをどのモード(どの範囲)で使用するかの設定で、以下の4つが指定可能。
disable | 完全に無効化する |
off | 無効化だが、実行時に有効化できる |
tracing/on | トレーシングJITを使う、これが一番高速。 |
function | 関数単位でJITを使う |
特に問題が無ければデフォルト値の「トレーシングJIT」一択です。
書かなくてもOKですが一応「opcache.jit=tracing」または「opcache.jit=on」と書いておくと安心。functionも使えますが、tracingに比べると処理速度はイマイチです。
opcache.jit_buffer_size
コンパイルされたJITのコードを保存する共有メモリのサイズ。
opcache.jit_buffer_sizeが0の場合は実質JITが無効化されるので注意。
そしてデフォルト値は「0」で、PHPではあらかじめJITは無効化されています。
個人的な推奨値は128MBあたりです。256MBでも良いかも。
余裕があるなら512MBや1Gも指定できますが、大きくしても速くはなりません。
その他まだまだ指定できる設定値はありますが、JITを普通に使うなら不要です。
上記のデフォルト値を考慮するなら、JITを有効化するには最低
zend_extension=opcache opcache.jit_buffer_size = 128M
の2行だけを「php.ini」に書くだけで有効化できるといえます。簡単!
まぁこれだけだと不安なので、一応全部書いた冒頭のコードを使いましょう・w・
まとめ
以上、PHP8以上で使えるJIT:(ジャストインタイム) コンパイルを有効化する方法とその設定値についてでした。以下もJITに関連した記事になりますので、該当する方はご確認していただければと思います。
関連
一部の共有サーバーではJITが使えないところがありますが、JITが使えるなら有効化しておけばさらにサイトを高速化できるかもしれません。是非お試し下さい!
ではではこのへんで・w・