2026/10/30

PHP 8.4 → 8.5 アップグレード手順(Amazon Linux 2023 / Apache + PHP-FPM)

- 対象環境:Amazon Linux 2023、PHP は AL2023 標準パッケージ(`php8.4*` → `php8.5*`)、Web サーバは Apache(`httpd`)+ PHP-FPM
- 8.4 と 8.5 は同時にインストールできないため、**8.4 をアンインストールし、8.5 をインストールする**(`dnf install --allowerasing` で同時に行う)

---

## 1. 事前確認

### 1-1. OS 全体を最新のリリースに更新しておく

更新の前に、EC2 コンソールから AMI またはスナップショットを取得する。

```bash
# 更新前の状態
rpm -q system-release            # 現在のリリースのバージョン
sudo find /etc \( -name '*.rpmnew' -o -name '*.rpmsave' \) 2>/dev/null   # 既存の設定ファイルの競合
systemctl --failed               # 起動に失敗しているサービスがないか
systemctl status php-fpm --no-pager
systemctl status httpd --no-pager

# 新しいリリースがあるか(何も出なければ最新なので、1-2 へ進む)
sudo dnf check-release-update

# OS 全体を最新リリースに更新(一覧を確認してから y)
sudo dnf upgrade --releasever=latest

# 再起動が必要か確認して、必要なら再起動
sudo dnf needs-restarting -r
sudo reboot

# 再起動後の確認
rpm -q system-release            # 新しい日付になっているか
sudo dnf check-release-update    # 何も出なければ最新
sudo find /etc \( -name '*.rpmnew' -o -name '*.rpmsave' \) 2>/dev/null   # 設定ファイルの競合(更新前から増えていないか)
systemctl --failed               # 起動に失敗しているサービスがないか
systemctl status php-fpm --no-pager
systemctl status httpd --no-pager
```

### 1-2. 8.5 のパッケージが提供されているか

```bash
sudo dnf clean metadata
sudo dnf list --available --repo=amazonlinux --releasever=latest 'php8.5*'
```

- `--repo=amazonlinux`:AL2023 標準のリポジトリのみ表示
- `php8.5-opcache` はない(8.5 から OPcache は PHP 本体に組み込み)

### 1-3. アプリケーションの互換性

- PHP 8.5 の移行ガイド(非互換の変更、非推奨になった機能):https://www.php.net/manual/en/migration85.php
- 使用しているフレームワーク・ライブラリが 8.5 に対応しているかを確認する
- Composer を使っている場合は、8.5 の環境で次を実行する

```bash
# composer.json / composer.lock の PHP バージョン・拡張モジュールの要件を満たしているか
composer check-platform-reqs
```

### 1-4. 自分でビルドした拡張モジュールがないか

```bash
# 拡張モジュールのディレクトリ
d=$(php -r 'echo ini_get("extension_dir");'); echo "$d"

# パッケージに含まれない拡張モジュール(pecl install などでインストールしたもの)。何も出なければなし
for f in "$d"/*.so; do rpm -qf "$f" >/dev/null 2>&1 || echo "パッケージ外: $f"; done
```

- 表示されたものは 8.5 用に再ビルドする

---

## 2. 現状の記録とバックアップ

```bash
# PHP のバージョン(CLI / FPM)
php -v
php-fpm -v

# インストール済みの PHP パッケージ(バージョン付き)
rpm -qa 'php8.4*' | sort

# インストール済みの PHP パッケージ名(バージョンなし。3. と 8. で使う)
rpm -qa --qf '%{NAME}\n' 'php8.4*' | sort | tee ~/php84-packages.txt

# 有効な拡張モジュールと設定値(アップグレード後の比較用)
php -m > ~/php84-modules.txt
php -i > ~/php84-info.txt

# エラーログの現在の行数(7. で、作業開始後に追加された行だけを表示するため)
sudo cat /var/log/php-fpm/error.log | wc -l | tee ~/php-fpm-error-lines.txt
sudo cat /var/log/httpd/error_log | wc -l | tee ~/httpd-error-lines.txt

# 設定ファイルのバックアップ
sudo tar czf /root/php84-config.tar.gz \
  /etc/php.ini /etc/php.d /etc/php-fpm.conf /etc/php-fpm.d /etc/httpd/conf.d/php.conf
```

- EC2 コンソールから **AMI またはスナップショットを取得**(切り戻し用)

---

## 3. インストールするパッケージの確認

```bash
# パッケージ名の php8.4 を php8.5 に置換した一覧
sed 's/^php8\.4/php8.5/' ~/php84-packages.txt | tee ~/php85-packages.txt

# 8.5 で提供されていないパッケージを表示(何も出なければすべて提供あり)
for p in $(cat ~/php85-packages.txt); do
  [ -z "$(sudo dnf repoquery -q --repo=amazonlinux --releasever=latest "$p")" ] && echo "提供なし: $p"
done
```

- 「提供なし」のパッケージは `~/php85-packages.txt` から行を削除する
  - `php8.5-opcache`:削除するだけでよい
  - それ以外:その拡張モジュールが必要か、別の入手方法があるかを確認する

---

## 4. 8.4 のアンインストールと 8.5 のインストール

```bash
# 8.5 をインストールし、競合する 8.4 をアンインストール(一覧を確認してから y)
sudo dnf install --releasever=latest --allowerasing $(cat ~/php85-packages.txt)
```

y を押す前に、表示される一覧で次を確認する。

| dnf の表示 | 確認すること |
|---|---|
| インストール(Installing) | `php8.5-xxx` が `~/php85-packages.txt` のとおり並んでいるか |
| 削除(Removing) | `php8.4-xxx` だけになっているか(**PHP 以外のパッケージがアンインストール対象に入っていたら中止する**) |

---

## 5. 設定ファイルの確認

```bash
# 退避・競合した設定ファイル(.rpmsave:元の設定が退避されたもの / .rpmnew:新しい標準設定)
sudo find /etc/php* /etc/httpd \( -name '*.rpmnew' -o -name '*.rpmsave' \) 2>/dev/null

# バックアップを展開して、アップグレード前との差分を確認
mkdir -p ~/php84-config
sudo tar xzf /root/php84-config.tar.gz -C ~/php84-config
sudo diff ~/php84-config/etc/php.ini /etc/php.ini
sudo diff -r ~/php84-config/etc/php.d /etc/php.d
sudo diff ~/php84-config/etc/php-fpm.conf /etc/php-fpm.conf
sudo diff -r ~/php84-config/etc/php-fpm.d /etc/php-fpm.d
sudo diff ~/php84-config/etc/httpd/conf.d/php.conf /etc/httpd/conf.d/php.conf
```

- `.rpmnew` が出た場合(例:`/etc/php.ini.rpmnew`):現在のファイルは変更済みのためそのまま残り、8.5 の標準が `.rpmnew` として置かれている。`.rpmnew` に自分で変更した設定を反映して、現在のファイルと置き換える

```bash
# 有効な設定だけの差分(コメントと空行を除く。< が現在の設定、> が 8.5 の標準)
diff <(sudo grep -Ev '^\s*(;|$)' /etc/php.ini) <(sudo grep -Ev '^\s*(;|$)' /etc/php.ini.rpmnew)
```
- 変更した設定が消えていたら、8.5 の新しいファイルに変更点だけを反映する(8.4 のファイルで上書きしない)
- `/etc/php.d/10-opcache.ini` は 8.5 のファイルになり、`zend_extension=opcache` の行がなくなる(8.5 から OPcache は PHP 本体に組み込み)。それ以外の差分は 8.5 の標準ファイルのコメントの違い
- OPcache の設定値に変わりがないかを確認する

```bash
# OPcache の設定値の差分(何も出なければ同じ)
php -i | grep '^opcache\.' | diff <(grep '^opcache\.' ~/php84-info.txt) -
```

- `opcache.file_cache_read_only` の追加と `opcache.jit_hot_loop` の 64 → 61 は 8.5 の初期値によるもの(`jit_hot_loop` は JIT を使う場合のみ関係する)

---

## 6. サービスの再起動

```bash
# 自動起動が有効か(8.4 のアンインストール時に無効化される場合がある)
systemctl is-enabled php-fpm
sudo systemctl enable php-fpm    # disabled と出た場合

sudo systemctl restart php-fpm   # 必須:8.5 の php-fpm を起動
sudo apachectl configtest        # Syntax OK を確認
sudo systemctl reload httpd
```

---

## 7. アップグレード後の確認

```bash
# バージョン
php -v ; php-fpm -v               # 8.5 になっているか
rpm -qa 'php8.5*' | sort          # インストール済みの PHP パッケージ(バージョン付き)
rpm -qa | grep php8.4             # 何も出なければ OK

# 拡張モジュールの差分(< が 8.4 にだけあったもの)
php -m | diff ~/php84-modules.txt -

# サービスの状態
systemctl status php-fpm --no-pager
systemctl status httpd --no-pager

# 作業開始後に追加されたエラーログ(Deprecated / Warning / Fatal / error が出ていないか)
sudo tail -n +$(( $(cat ~/php-fpm-error-lines.txt) + 1 )) /var/log/php-fpm/error.log
sudo tail -n +$(( $(cat ~/httpd-error-lines.txt) + 1 )) /var/log/httpd/error_log
```

- 拡張モジュールの差分に出たものは、3. で一覧から削除したもの以外なら原因を確認する
- ブラウザで各サイトの主な画面を確認する(ログイン、DB 参照、画像やファイルのアップロード、メール送信、PDF・Excel 出力など)

---

## 8. 切り戻し

問題が出た場合は、AMI から復元するか、8.5 をアンインストールして 8.4 を再インストールする。

```bash
# 8.4 を再インストールし、競合する 8.5 をアンインストール(一覧を確認してから y)
sudo dnf install --releasever=latest --allowerasing $(cat ~/php84-packages.txt)

# 設定ファイルをアップグレード前の状態に戻す
sudo tar xzf /root/php84-config.tar.gz -C /

sudo systemctl enable php-fpm
sudo systemctl restart php-fpm
sudo apachectl configtest
sudo systemctl reload httpd

# 切り戻し後の確認
php -v ; php-fpm -v               # 8.4 に戻っているか
rpm -qa | grep php8.5             # 何も出なければ OK
systemctl status php-fpm --no-pager
systemctl status httpd --no-pager
```

0 件のコメント:

コメントを投稿

人気の投稿