概要
このページはEC-CUBE2系サイトのPHP8対応の続きです。
このページではWarningと負荷対策について記載し、最後にPHP8対応のまとめを記載します。
※ PHP8対応でお困りの方は
ご相談ください。
Warning対策(PHP、Smarty)
【対応理由】Warningの記載による負荷軽減およびerror.logの記述を適切にし必要なものを確認できるようにする
【原因】
・変数宣言や初期値がない変数へのアクセス
・配列に存在しないKeyへの参照
→多くはSmarty側の$arrFormや$arrErrといったformに関連した変数へのアクセスで起こる
【PHPの調整内容】
・変数宣言や初期値を設定する
・issetで変数を参照前に判定する
・$arrErrのKeyの初期値をあらかじめ設定する
【Smartyの調整内容】
・issetで変数を参照前に判定する
・コーディングの間違え修正
→$arrForm[$key]でしかアクセスできないところに$arrForm[$key].lengthなどでアクセスしている部分を修正
負荷対策:Smartyでのjson形式の出力に時間がかかる
【原因】json形式のデータにエスケープ処理を行っているため
独自カスタマイズなどでjson形式のデータをテンプレート側に出力している場合に行います。
【対応内容】nofilterを使ってエスケープ処理をスキップする
例)以下の
$CategoryListにJson形式のデータが出力されているとします。
<!--{$CategoryList}-->
以下のようにnofilterを使ってエスケープしないようにします。
<!--{$CategoryList nofilter}-->
※ エスケープ処理を外す場合は脆弱性と隣合わせになるので十分検討されることをおすすめします。
PHP8対応のまとめ
所見
PHPのバージョンアップ対応はPHP5.3→5.6、PHP5→PHP7、PHP7→PHP8と行ってきましたが、今回の対応が一番ハードルが高い内容でした。
これまで簡易に演算でキャストしていたところや、中身が曖昧でもうまく動いていた箇所が動かなくなったり、エラーなく結果が異なったりするなど、型の厳格化が進んだことで、曖昧だったことを利用したコードが使えなくなることがハードルの高さの一因となりました。
今回の問題の大きい箇所
==、!=の変更は使用箇所が多く動かさないと正しいかの見極めが難しいため、専用メソッドに置き換えることになり時間を取られました。
また、システムエラーが出ず意図通りに動作しない内容(配列のKey等)やgrep検索しにくい内容(文字列の演算)といった動かさないとわからない部分は全項目のテストに委ねる必要がありました。
※ 注意して記載しておりますが、ご参考にされる場合は十分に確認をお願いいたします。
※ ご利用にあたって生じた損害について一切の責任を追わないものとします。
PHP8対応でお困りの方へ