【PHP】PHP7.4から8.1にバージョンアップしてみた

PHP

はじめに

お疲れさまです。

システム開発第2グループの祖父江です。

現在業務で社内ツールのリニューアルを行っているのですが、開発中にプロジェクトのPHPのバージョンを7.4から8.1にバージョンアップする作業を行いました。

今回のバージョンアップ作業で学んだ手順や考慮するべき点についてまとめていきたいと思います。

この記事でやること

PHP7.4から8.1にバージョンアップする。

環境

  • EC2を利用しています
    • OSイメージ:Amazon Linux 2 Kernel 5.10
  • PHPのバージョン: PHP 7.4.33 (cli)
  • PHPUnitのバージョン: 9.5.28
  • CakePHPのバージョン: 4.2.12
  • nginx: nginx/1.22.0
  • php-fpm: PHP 7.4.33 (fpm-fcgi)

事前調査・準備

PHP

PHPの各バージョンはリリースから3年間サポートされます(2年間のアクティブサポート+セキュリティサポート1年)が、PHP7.4はセキュリティサポートが2022年11月28日で終了しているため、今後の保守を考えてPHP8.1へのバージョンアップを実施することになりました。

PHPのサポート情報

まずは公式ドキュメントを参照し、互換性のない変更点を確認します。

PHP7.4.xからPHP8.0.xへの移行
PHP8.0.xからPHP8.1.xへの移行

PHPUnit

PHPUnitでテスコードを作成していたため、PHPとPHPUnitの対応関係を調べる必要がありました。

現在のPHPUnitのバージョンを確認します。

PHPとPHPUnitのバージョン対応一覧表を見るとPHPUnit9系はPHP7.3以上のバージョンに対応していることがわかりました。

現在のPHPUnitのバージョンが9.5.28、アップデート後のPHPのバージョンが8.1なので問題ないことが確認できます。

CakePHP

CakePHPとPHPの対応関係を確認します。

現在のPHPUnitのバージョンを調べます。

CakePHP4のシステム要件によればCakePHP4系はPHP7.4以上(PHP8.1も含む)に対応しているため、こちらも問題ないことがわかりました。

検証環境の用意

今回バージョンアップするサービスはすでに展開されていたため、バージョンアップ作業がうまくいくかどうか、バージョンアップ後にサービスが機能するかどうかを事前に別の環境で確かめる必要がありました。

サービスが動いているEC2インスタンスとは別のEC2インスタンスを利用し検証を行い、PHP8.1にバージョンアップ後にテストコードを実行し、挙動に問題が無いことを確認した上で、本番環境でのバージョンアップを行いました。

PHP8.1へのバージョンアップ手順

PHPに関する設定を記述するphp.iniファイルのバックアップを取ります。

まずphp.iniファイルの場所を探します。

/etcディレクトリ配下にあることが分かったので、バックアップを作成します。

この際に自分で変更を加えたphp.iniがあるなら合わせてバックアップを取っておきます。

次に現在のPHPのバージョンを確認します。

インストール済みのPHPパッケージを確認します。バージョンアップ後にも同じパッケージをインストールするため、出力をメモしておきます。

現在のPHPを削除するため、ワイルドカードを使ってPHPと名前のついたファイルを削除します。

インストールできるPHPを確認します。

Amazon Linux Extrasを使用することでAmazon EC2での使用に最適化されたパッケージを利用することができます。

php7.4のトピックが有効になっていることがわかりました。

PHP7.4を廃止します。

8.1のダウンロードします。

インストール済みのパッケージを確認します。

不足しているパッケージをインストールします。

バージョン確認を確認します。

nginxとphp-fpmの再起動を行います

これでバージョンアップすることができました!

テストコードの実行・ブラウザからの挙動を確認します。

まとめ

PHPのバージョンアップに伴いPHPunitやCakePHP等の関連するパッケージやフレームワークとの対応も調査する必要があることを学びました。

また今回はバージョンアップ後の互換性のない変更について、ドキュメントを読むこと・バージョンアップ後にテストコードを実行することで影響範囲を確認しましたが、静的解析ツールを使った調査方法(参考: PHP8などへ移行する際の互換性チェック)などもあるようなので、今後バージョンアップ作業を実施するときは使ってみようと思います。

気になる点や感想などあればぜひ教えて下さい。

参考

PHP