先週、PHPの新しいバージョンである8.0系がリリースされました。

PHP8.0では待望のJITコンパイラ(Just-In-Time Compiler)が導入され、PHPという言語の存在感が増したように感じます。

実行時コンパイラ - Wikipedia


SOY CMS、SOY Shopで大きく影響を与えたものが、ビルドイン関数のdate関数とstrlenでした。

なんでよく使うビルドイン関数なんだよ!?と疑問になるかと思います。

PHP: 内部(ビルトイン)関数 - Manual


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関数の方で、第二引数の値がタイムスタンプではないぞとエラーになるという症状にハマりました。

SOY2HTMLで繰り返し表示 - HTMLList編


PHP8.0対応に合わせて、コードの書き方が更に厳格化したので、JITコンパイラ以外でもパフォーマンスが向上しているかもしれません。

PHP8.0に対応したバージョンのダウンロードは下記から行うことができます。

https://saitodev.co/soycms/


今回の修正はPHP7系でも普通に使用出来るものですので、不安であれば現在のPHPのバージョンでご利用下さい。

標準機能の確認は終わりましたが、各プラグインの確認は順次行っていきます。


追記

下記の記事の対応をしたら、更に高速化するかもしれない。

【SEO対策】PHPのOPCacheの更新チェックの頻度を下げる