Amazon Linux 2 に PHP8.1 を導入する

Amazon Linux 2 に PHP8.1 を導入する機会があったので、手順をまとめてみました。
PHP8.0 であれば amazon-linux-extras から入れることができるのですが、 PHP8.1 については amazon-linux-extras に用意されていません。 (2022年3月現在)

今回、 amazon-linux-extras から導入した PHP8.0 を、 remi リポジトリの PHP8.1 に入れ替えております。

# remi リポジトリの導入

amazon-linux-extras から epel をインストール後、remi リポジトリを追加して、そこから PHP8.1 を導入することにします。

```
$ sudo amazon-linux-extras install epel
...
$ sudo yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
...
```

# PHP8.1 インストール

まず、すでにインストールされている PHP8.0 をアンインストールします。

```
$ sudo yum remove php-common
```

そして、 PHP8.1 をインストール。

```
$ sudo yum install php81
```

他に必要な PHP のモジュールがあれば併せてインストール。

```
$ sudo yum install php81-php-mbstring php81-php-pdo php81-php-gd php81-php-mysqlnd php81-php-xml
```
```
$ php81 -v
PHP 8.1.0 (cli) (built: Nov 23 2021 18:56:11) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.1.0, Copyright (c) Zend Technologies
```
無事インストールできたようです。

# alternatives

ただ php とコマンドを打っても認識できない状態なので、 alternatives で変更します。

```
$ php -v
-bash: php: コマンドが見つかりません
$ sudo alternatives --install /usr/bin/php php /usr/bin/php81 1
$ php -v
PHP 8.1.0 (cli) (built: Nov 23 2021 18:56:11) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.1.0, Copyright (c) Zend Technologies
```
php コマンドが使えるようになりました。

# php-zip が入らない...

ところが後日、php-zip を導入しようとしたところ、 libzip5 と libzip がコンフリクトして、導入できません。

```
$ sudo yum install php81-php-pecl-zip

＜中略＞

Transaction check error:
  file /usr/lib64/libzip.so.5 from install of libzip5-1.8.0-2.el7.remi.x86_64 conflicts with file from package libzip-1.3.2-1.amzn2.0.1.x86_64
```

libzip を削除してから、 php-zip パッケージを導入してみました。

```
$ sudo yum remove libzip
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ libzip.x86_64 0:1.3.2-1.amzn2.0.1 を 削除
--> 依存性解決を終了しました。

依存性を解決しました

===================================================================================================================
 Package                アーキテクチャー       バージョン                        リポジトリー                 容量
===================================================================================================================
削除中:
 libzip                 x86_64                 1.3.2-1.amzn2.0.1                 @amzn2-core                 117 k

トランザクションの要約
===================================================================================================================
削除  1 パッケージ

インストール容量: 117 k
上記の処理を行います。よろしいでしょうか？ [y/N]y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  削除中                  : libzip-1.3.2-1.amzn2.0.1.x86_64                                                    1/1
  検証中                  : libzip-1.3.2-1.amzn2.0.1.x86_64                                                    1/1

削除しました:
  libzip.x86_64 0:1.3.2-1.amzn2.0.1

完了しました!
```
幸い、依存パッケージは無かったようです。

```
$ sudo yum install php81-php-pecl-zip
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
ロックファイル /var/run/yum.pid が存在します: PID 13752 として別に実行されています。
Another app is currently holding the yum lock; waiting for it to exit...
 他のアプリケーション: yum
   メモリー: 333 M RSS (550 MB VSZ)
    開始   : Wed Mar 23 18:06:03 2022 - 00:06 秒経過
    状態   : 実行中、PID: 13752
Another app is currently holding the yum lock; waiting for it to exit...
 他のアプリケーション: yum
   メモリー: 334 M RSS (551 MB VSZ)
    開始   : Wed Mar 23 18:06:03 2022 - 00:08 秒経過
    状態   : 実行中、PID: 13752
219 packages excluded due to repository priority protections
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ php81-php-pecl-zip.x86_64 0:1.20.0-1.el7.remi を インストール
--> 依存性の処理をしています: libzip5(x86-64) >= 1.8.0 のパッケージ: php81-php-pecl-zip-1.20.0-1.el7.remi.x86_64
--> 依存性の処理をしています: libzip.so.5()(64bit) のパッケージ: php81-php-pecl-zip-1.20.0-1.el7.remi.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ libzip5.x86_64 0:1.8.0-2.el7.remi を インストール
--> 依存性の処理をしています: libzstd(x86-64) >= 1.3.6 のパッケージ: libzip5-1.8.0-2.el7.remi.x86_64
--> 依存性の処理をしています: libzstd.so.1()(64bit) のパッケージ: libzip5-1.8.0-2.el7.remi.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ libzstd.x86_64 0:1.5.2-1.amzn2 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

===================================================================================================================
 Package                         アーキテクチャー    バージョン                      リポジトリー             容量
===================================================================================================================
インストール中:
 php81-php-pecl-zip              x86_64              1.20.0-1.el7.remi               remi-safe                55 k
依存性関連でのインストールをします:
 libzip5                         x86_64              1.8.0-2.el7.remi                remi-safe                64 k
 libzstd                         x86_64              1.5.2-1.amzn2                   amzn2-core              284 k

トランザクションの要約
===================================================================================================================
インストール  1 パッケージ (+2 個の依存関係のパッケージ)

合計容量: 403 k
インストール容量: 1.0 M
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  インストール中          : libzstd-1.5.2-1.amzn2.x86_64                                                       1/3
  インストール中          : libzip5-1.8.0-2.el7.remi.x86_64                                                    2/3
  インストール中          : php81-php-pecl-zip-1.20.0-1.el7.remi.x86_64                                        3/3
  検証中                  : libzstd-1.5.2-1.amzn2.x86_64                                                       1/3
  検証中                  : libzip5-1.8.0-2.el7.remi.x86_64                                                    2/3
  検証中                  : php81-php-pecl-zip-1.20.0-1.el7.remi.x86_64                                        3/3

インストール:
  php81-php-pecl-zip.x86_64 0:1.20.0-1.el7.remi

依存性関連をインストールしました:
  libzip5.x86_64 0:1.8.0-2.el7.remi                         libzstd.x86_64 0:1.5.2-1.amzn2

完了しました!
```

無事 php-zip パッケージの ZipArchive クラスが利用できるようになりました。