先週、PHPの新しいバージョンである8.0系がリリースされました。
PHP8.0では待望のJITコンパイラ(Just-In-Time Compiler)が導入され、PHPという言語の存在感が増したように感じます。
SOY CMS、SOY Shopで大きく影響を与えたものが、ビルドイン関数のdate関数とstrlenでした。
なんでよく使うビルドイン関数なんだよ!?と疑問になるかと思います。
SOY CMSの仕様の一つのHTMLListで<!-- block:id="***" -->で囲った箇所を繰り返す時、最初のデータが下記のダミーオブジェクトで、
/** * @package SOY2.SOY2HTML */ class HTMLList_DummyObject extends ArrayObject{ function __call($func,$args){ return new HTMLList_DummyObject(); } function __get($key){ return new HTMLList_DummyObject(); } function __toString(){ return ""; } }
例えば、HTMLListの処理内で、
date("Y-m-d H:i:s", $entry->getCdate());
のような処理をすると、初回の処理の$entryがHTMLList_DummyObjectクラスの値で、$entry->getCdate()で本来であれば記事作成日のタイムスタンプを返すところ、上のコードにあるようにHTMLList_DummyObjectオブジェクトを返し、ビルドイン関数のdate関数の方で、第二引数の値がタイムスタンプではないぞとエラーになるという症状にハマりました。
PHP8.0対応に合わせて、コードの書き方が更に厳格化したので、JITコンパイラ以外でもパフォーマンスが向上しているかもしれません。
PHP8.0に対応したバージョンのダウンロードは下記から行うことができます。
今回の修正はPHP7系でも普通に使用出来るものですので、不安であれば現在のPHPのバージョンでご利用下さい。
標準機能の確認は終わりましたが、各プラグインの確認は順次行っていきます。
追記
下記の記事の対応をしたら、更に高速化するかもしれない。
【SEO対策】PHPのOPCacheの更新チェックの頻度を下げる