タグ別アーカイブ: php

このブログのPHPを5.4から7.3にバージョンアップした話

ソリューションウェアのWebサイトとこのブログはWordPressで作られていますが、長らくPHP5.4で運用されてきたところ今更ながらPHP7.3へバージョンアップを行いました。その際にプラグインやテーマの互換性検証に用いた方法のまとめです。

WordPressとPHPバージョンの関係

WordPress5.2から、PHPの最低必須バージョンが変更になりました。このため、古いPHPを使い続けているサイトでは、WordPressの今後のバージョンを利用するためにはPHPのバージョンアップが必要になります。

プラグインの互換性確認

WordPress本体はPHPの最新バージョンに追随していますし(最新バージョンの利用が推奨もされていますし)きちんとメンテナンスされているテーマやプラグインも同様ですが、長年放置されているものはPHPのバージョンアップにより不具合が生じる可能性があります。バージョンアップ前にきちんと検証しましょう。

PHP Compatibility Checker

まず簡易なものにPHP Compatibility CheckerというWordPressプラグインがあり、これを導入して実行すると例えば以下のような結果が得られます。

名称: Twenty Twelve
FILE: /home/xxx/www/blog/wp-content/themes/twentytwelve/footer.php
--------------------------------------------------------------------------
FOUND 0 ERRORS AND 1 WARNING AFFECTING 1 LINE
--------------------------------------------------------------------------
1 | WARNING | File has mixed line endings; this may cause incorrect results
--------------------------------------------------------------------------

名称: WP Multibyte Patch
PHP 7.3 互換性があります。
Update Available: 2.8.3; Current Version: 2.8.2;

名称: WP Super Cache
このプラグイン/テーマはスキャンするには大きすぎるため、サーバーのプロセスを強制終了する前にスキップしました。

テーマやプラグインの互換性の問題の有無をチェックしてくれるので、これで引っかかったところはPHPのバージョンアップ前に対処しておく必要があります。

PHPStan(Docker)

問題は、PHP Compatibility Checkerでスキップされるものをどうやって確認するかです。今回はPHPStanという静的解析ツールを使用しました。composerでインストールして動かすこともできますが、Docker版があるのでその方が手軽と思います。

$ docker pull phpstan/phpstan
$ docker run --rm -v /home/xxx/www/blog/wp-content/plugins/wp-syntax-highlighter:/app phpstan/phpstan analyse /app/lib

互換性だけではなくもっと広範囲にチェックしてくれる静的解析ツールなので、互換性の問題以外にもよろしくないコードがあれば引っかかります。作業スコープがPHPのバージョンアップだけであれば、片っ端から修正を加えたりせず互換性の問題につながり得る指摘なのかを個別に評価していく必要があります。あくまでも疑わしいところを洗い出すまでがツールの仕事で、最後は人間の判断です。

PHPStan(Web)

Docker版のPHPStanでほとんどの場合はチェックできますが、中にはプラグイン内部でDIを使って実装されているなど、静的解析で依存関係を拾いきれないものがあります。PHPStanはcomposerのautoloaderを使って云々ということなのでPHPちょっとできるエンジニアはcomposer.jsonをきちんと調整してあげればチェックできるのかなと思いますが、僕はなにもわからないのでWeb版のPlaygroundにコピペしてチェックという原始的な方法に行き当たりました。構文上の問題は検出できるので、今回の目的であればとりあえず事足ります。

PHPStan Web版の実行結果例