EC2でPHPを8.2へバージョンアップ

先日、EC2環境でPHPを8.2にバージョンアップする機会があったので、つまずきポイントについて書き留めます。

PHP8.2の新機能についてはこちらで詳しく紹介されてます。

https://qiita.com/rana_kualu/items/64bd73ad3d314a1cccdc

バージョンアップの流れはこんなイメージです。

1. 既存バージョンをアンインストールする
2. パッケージリポジトリをアップデートする
3. 新バージョンをインストールする


### 1. 既存バージョンをアンインストールする
現行バージョンを確認します。
```
$ php -v
PHP 8.1.4 (cli) (built: Mar 15 2022 20:18:41) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.1.4, Copyright (c) Zend Technologies
```

現行インストールされているパッケージも確認しておきます。
```
$ yum list installed PHPphp*
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
226 packages excluded due to repository priority protections
インストール済みパッケージ
php81.x86_64                                             8.1-1.el7.remi                                    @remi-safe
php81-php-cli.x86_64                                     8.1.4-1.el7.remi                                  @remi-safe
php81-php-common.x86_64                                  8.1.4-1.el7.remi                                  @remi-safe
php81-php-gd.x86_64                                      8.1.4-1.el7.remi                                  @remi-safe
php81-php-mbstring.x86_64                                8.1.4-1.el7.remi                                  @remi-safe
php81-php-mysqlnd.x86_64                                 8.1.4-1.el7.remi                                  @remi-safe
php81-php-pdo.x86_64                                     8.1.4-1.el7.remi                                  @remi-safe
php81-php-pecl-zip.x86_64                                1.20.0-1.el7.remi                                 @remi-safe
php81-php-xml.x86_64                                     8.1.4-1.el7.remi                                  @remi-safe
php81-runtime.x86_64                                     8.1-1.el7.remi                                    @remi-safe
```

現行バージョンをアンインストールします。

```
$ sudo yum remove "php*"
・・・
・・・
削除しました:
  php81.x86_64 0:8.1-1.el7.remi                            php81-php-cli.x86_64 0:8.1.4-1.el7.remi                  
  php81-php-common.x86_64 0:8.1.4-1.el7.remi               php81-php-gd.x86_64 0:8.1.4-1.el7.remi                   
  php81-php-mbstring.x86_64 0:8.1.4-1.el7.remi             php81-php-mysqlnd.x86_64 0:8.1.4-1.el7.remi              
  php81-php-pdo.x86_64 0:8.1.4-1.el7.remi                  php81-php-pecl-zip.x86_64 0:1.20.0-1.el7.remi            
  php81-php-xml.x86_64 0:8.1.4-1.el7.remi                  php81-runtime.x86_64 0:8.1-1.el7.remi                    

完了しました!
```



### 2. パッケージリポジトリをアップデートする

・パッケージリポジトリを更新します
```
$ sudo yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
remi-release-7.rpm                                                                            |  27 kB  00:00:00     
/var/tmp/yum-root-49dq_S/remi-release-7.rpm を調べています: remi-release-7.9-5.el7.remi.noarch
・・・
更新:
  remi-release.noarch 0:7.9-5.el7.remi                                                                               

完了しました!
```



### 3. 新バージョンをインストールする
・yum からPHPをインストールします
```
$ sudo yum install --enablerepo=epel,remi.,remi-php82, php php-cli php-common php-gd php-mbstring php-mysqlnd php-pdo php-xml
インストール:
 php.x86_64 0:8.0.25-1.amzn2            php-cli.x86_64 0:8.0.25-1.amzn2       php-common.x86_64 0:8.0.25-1.amzn2   php-gd.x86_64 0:8.0.25-1.amzn2   
 php-mbstring.x86_64 0:8.0.25-1.amzn2   php-mysqlnd.x86_64 0:8.0.25-1.amzn2   php-pdo.x86_64 0:8.0.25-1.amzn2      php-xml.x86_64 0:8.0.25-1.amzn2  

完了しました!

$ yum list installed |grep php
gd3php.x86_64                         2.3.3-4.el7.remi               @remi-safe 
oniguruma5php.x86_64                  6.9.7.1-1.el7.remi             @remi-safe 
php.x86_64                            8.0.25-1.amzn2                 @amzn2extra-php8.0
php-cli.x86_64                        8.0.25-1.amzn2                 @amzn2extra-php8.0
php-common.x86_64                     8.0.25-1.amzn2                 @amzn2extra-php8.0
php82-php-common.x86_64               8.2.1-1.el7.remi               @remi-safe 
php82-php-pecl-zip.x86_64             1.21.1-1.el7.remi              @remi-safe 
php82-runtime.x86_64                  8.2-2.el7.remi                 @remi-safe 
```


:::note alert
バージョンが8.1から8.0へバージョンダウンしてました。。
:::

```
$ php -v
PHP 8.0.25 (cli) (built: Oct 31 2022 22:42:34) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.25, Copyright (c) Zend Technologies
```

:::note warn
原因は、
EC2ではamazon-linuxリポジトリが優先され、`—enablerepo`で別のリポジトリを指定しても有効にならないためのようです。
:::

amazon-linux-extrasに登録されてるパッケージを確認してみると、PHP8.2は入っていませんでした。。。amazon-linuxのリポジトリを封じたい。
```
$ amazon-linux-extras list
  0  ansible2                 available    \
        [ =2.4.2  =2.4.6  =2.8  =stable ]
  2  httpd_modules            available    [ =1.0  =stable ]
  3  memcached1.5             available    \
        [ =1.5.1  =1.5.16  =1.5.17 ]
  6  postgresql10             available    [ =10  =stable ]
  9  R3.4                     available    [ =3.4.3  =stable ]
 10  rust1                    available    \
        [ =1.22.1  =1.26.0  =1.26.1  =1.27.2  =1.31.0  =1.38.0
          =stable ]
 18  libreoffice              available    \
        [ =5.0.6.2_15  =5.3.6.1  =stable ]
 19  gimp                     available    [ =2.8.22 ]
 20  docker=latest            enabled      \
        [ =17.12.1  =18.03.1  =18.06.1  =18.09.9  =stable ]
 21  mate-desktop1.x          available    \
        [ =1.19.0  =1.20.0  =stable ]
 22  GraphicsMagick1.3        available    \
        [ =1.3.29  =1.3.32  =1.3.34  =stable ]
 23  tomcat8.5                available    \
        [ =8.5.31  =8.5.32  =8.5.38  =8.5.40  =8.5.42  =8.5.50
          =stable ]
 24  epel=latest              enabled      [ =7.11  =stable ]
 25  testing                  available    [ =1.0  =stable ]
 26  ecs                      available    [ =stable ]
 27  corretto8                available    \
        [ =1.8.0_192  =1.8.0_202  =1.8.0_212  =1.8.0_222  =1.8.0_232
          =1.8.0_242  =stable ]
 29  golang1.11               available    \
        [ =1.11.3  =1.11.11  =1.11.13  =stable ]
 30  squid4                   available    [ =4  =stable ]
 32  lustre2.10               available    \
        [ =2.10.5  =2.10.8  =stable ]
 33  java-openjdk11           available    [ =11  =stable ]
 34  lynis                    available    [ =stable ]
 36  BCC                      available    [ =0.x  =stable ]
 37  mono                     available    [ =5.x  =stable ]
 38  nginx1                   available    [ =stable ]
 39  ruby2.6                  available    [ =2.6  =stable ]
 40  mock                     available    [ =stable ]
 41  postgresql11             available    [ =11  =stable ]
 43  livepatch                available    [ =stable ]
 44  python3.8                available    [ =stable ]
 45  haproxy2                 available    [ =stable ]
 46  collectd                 available    [ =stable ]
 47  aws-nitro-enclaves-cli   available    [ =stable ]
 48  R4                       available    [ =stable ]
 49  kernel-5.4               available    [ =stable ]
 50  selinux-ng               available    [ =stable ]
 51  php8.0=latest            enabled      [ =stable ]
 52  tomcat9                  available    [ =stable ]
 53  unbound1.13              available    [ =stable ]
 54  mariadb10.5              available    [ =stable ]
 55  kernel-5.10              available    [ =stable ]
 56  redis6                   available    [ =stable ]
 57  ruby3.0                  available    [ =stable ]
 58  postgresql12             available    [ =stable ]
 59  postgresql13             available    [ =stable ]
 60  mock2                    available    [ =stable ]
 61  dnsmasq2.85              available    [ =stable ]
 62  kernel-5.15              available    [ =stable ]
 63  postgresql14             available    [ =stable ]
 64  firefox                  available    [ =stable ]
 65  lustre                   available    [ =stable ]
  _  php8.1                   available    [ =stable ]
 67  awscli1                  available    [ =stable ]
```


:::note info
解決策、
amazon-linuxリポジトリを`--disablerepo`で無効にしてあげます。
:::

```
$ sudo yum -y install php php-cli php-common php-gd php-mbstring php-mysqlnd php-pdo php-pecl-zip php-xml runtime  --enablerepo=epel,remi,remi-php82 --disablerepo=amzn2-core,amzn2extra-php8.0
```

```
$ yum list installed |grep php
 gd3php.x86_64                         2.3.3-4.el7.remi               @remi-safe 
 oniguruma5php.x86_64                  6.9.7.1-1.el7.remi             @remi-safe 
 php.x86_64                            8.2.1-1.el7.remi               @remi-php82
 php-cli.x86_64                        8.2.1-1.el7.remi               @remi-php82
 php-common.x86_64                     8.2.1-1.el7.remi               @remi-php82
 php-gd.x86_64                         8.2.1-1.el7.remi               @remi-php82
 php-mbstring.x86_64                   8.2.1-1.el7.remi               @remi-php82
 php-mysqlnd.x86_64                    8.2.1-1.el7.remi               @remi-php82
 php-pdo.x86_64                        8.2.1-1.el7.remi               @remi-php82
 php-pecl-zip.x86_64                   1.21.1-1.el7.remi.8.2          @remi-php82
 php-sodium.x86_64                     8.2.1-1.el7.remi               @remi-php82
 php-xml.x86_64                        8.2.1-1.el7.remi               @remi-php82
```

無事、バージョンアップすることができました！

```
$ php -v
 PHP 8.2.1 (cli) (built: Jan  3 2023 18:40:55) (NTS gcc x86_64)
 Copyright (c) The PHP Group
 Zend Engine v4.2.1, Copyright (c) Zend Technologies
```

 ステージング環境ではすんなりバージョンアップできたので油断してましたが、おかげでパッケージリポジトリの知識が深まりました。めでたし、めでたし。