PHP8

 PHPの新しいバージョンPHP8がリリースされて2年ほどになるか。当ブログもPHPのバージョンを7.4から最新の8.1にアップグレードしようか[注1]と、ローカルのテスト環境で導入してみた。案の定、さっそく”死の真っ白画面”(WSoD:White Screen of Death)にみまわれた。なにか致命的なエラーが生じているのだが、エラーメッセージもエラーコードも表示されない[注2]。こういうとき、基礎知識の貧しさが露呈してうろたえるのだが、テスト環境なので、じっくり攻めればいい。とはいえ、基礎知識の乏しさはGoogle先生に補ってもらう他はないのに、初手の検索キーワードすら思い浮かばないから、苛立ちはする。PHP、Wordpress、空白画面、などで当たりをつけ、めぼしい情報がないか探し廻って、それらしい記事に行き着き、いろいろな処方が挙げてあるのを当てずっぽうに試しているうちに[注3]、エラーメッセージは表示されるようになり[注4]、原因は、4年前のWordpressの導入当初に採用したテーマ[注5]がPHP8で廃止された関数create_functionを使っていることにあることがわかった。オリジナルはPHPの仕様変更にあわせて開発元が新しい関数functionへ修正済みなのだが、当方がいじくり回している改造版では旧いcreate_functionがそのまま残っていたのだ。エラーメッセージは当該PHPソースコードのファイル名と行番号まで明示してくれているし、書き換えの見本はWeb上にたくさん出ているので、修正は簡単に済み、めでたくWSoDは消えて通常の画面が表示されるようにはなった。しかし問題は残ったままだ。例えば、
・何をどう変更したらエラーメッセージが表示されるようななったのか、御本人が理解できていない
・計画的なエラー原因追求ではないため、操作の前提も履歴も記録できていない
・エラーの再現条件を確定できていない(とりあえずWSoD現象は回避できたが、他にもバグを抱えている可能性が高い)
・create_functionとfunctionの機能もその差異も分からず、ただ見様見真似で構文をいじっただけ(PHPもWordpressもその基本構造や動作原理を知らぬままいじっている)
・テーマを子テーマとして設定せず、オリジナル・テーマのコピーを直接改変している。オリジナルを親テーマとして子テーマを作り、カスタマイズはその子テーマに対し行えば、オリジナルのバージョンアップが子テーマにも反映される仕組みができるのに、その作法に従っていなかった。今となっては、どこをどう改修したのか追えず、親子関係を再設定できなくなってしまった。これを使い続ければ将来的な環境の変化に追随できなくなるだろう。
・自前のプログラム・コードが書けないので、プラグイン[注6]を多用している。プラグインの多用はバージョン管理上の障害を生じやすい。
などなど。抽象的に言えば、
・中途半端、生兵法、行き当りばったり
・見様見真似、基礎訓練嫌い
・現象的で局所的な視野
ということになろう。なにやら我が身の履歴そのままではないか。

 Wordpressというツールがそもそも、PHPやSQLやHTML/CSSやの深い知識なしに、簡便にWebサイトを構築できることを標榜しているのだから、それを飯の種としてるわけではないユーザとしてはこれでよしと、と言えなくはないが、それを認めるのが悔しいということはあるのだ。あらためてテーマの親子設定をやり直そうか、それならいっそ新しいグーテンベルグのブロック編集に準拠した別テーマへ乗り換えて、模様替えをしてみようか、などと考える。いつのことになることやら。

注1 当サイトが稼働しているサーバでPHP8がサポート開始されたとの案内があり、PHP8では応答速度が従来版の2倍ほどもアップするという評判も目にした。

注2 ハッカーにサーバの内部情報をちらりとでも見せないためのPHPのデフォルトの設定らしい。たしかにエラーメッセージの中にサーバーのディレクトリ構造を示すURLが露出するので、ハッカーは標的サーバーにエラーを起こさせれば、攻撃をより精確にできる材料にはなる。

注3 試したのは、
・PHP7.4への切り戻し(これはLocalの管理機能で簡単に行える)
・プラグインの無効化/有効化(プラグインを20個以上採用しているので、結構手間がかかる)
・テーマの切り替え
・キャッシュのクリア
などなど

注4 デバッグモード属性を意図的に変更したからではなく、何かの拍子にエラーメッセージ表示されるようになったのだった。

注5 Wordpressでは画面構成のベースにするテンプレートのセットが膨大に公開されていて、それぞれをテーマと呼んでいる。サイトの用途やデザインに応じて無償/有償の既成品群から選択したり、一から自作することもできる。

注6 Wordpressにはプラグインと呼ばれる種々様々の機能拡張部品がサードパーティから提供されている。必要に応じて利用すればWordpressのコードを書く手間が省けて便利だが、一種のブラックボックスではあるので、プラグイン間の整合性やバージョンアップへの対応が問題を引き起こすリスクもある。

注7 
 PHPでcreate_functionがfunctionへ変更されたのは、create_functionに内部的なセキュリティ上の脆弱性があり、処理効率も悪いからだという。同等の機能をもち安全性と処理効率の高いfunctionがPHP5.3からリリースされており、create_functionは廃止されるという警告はそのときからなされていて、PHP8で予告通り廃止された。猶予期間は充分にあったのだ。