Amazon Linux 2023 で PHP Redis エクステンションをコンパイルする

Graviton な Amazon Linux 2023 で PHP8.2 を利用しています。

ElastiCache の Redis でセッションを使いたいと思ったんですが、2024年1月時点で、Amazon Linux 2023 のレポジトリには用意されていませんでした。

いろいろ頑張って調べましたが、自分でコンパイルしたほうが良さそうです。

ということで、コンパイルしてみました。

## 前提条件

すでに他の PHP 8.2 本体やエクステンションはインストールされていると想定

## STEP 1. GitHub に機能要望を送る

GitHub の機能要望の[該当 Issue](https://github.com/amazonlinux/amazon-linux-2023/issues/328) がまだオープンだったら、 "I want it too!" とコメントをする

コンパイルしたくない！

## STEP 2. コンパイルツールをインストールする

php-devel, gcc, make や git をインストールする

```
sudo dnf install php8.2-devel gcc make git
```

## STEP 3. phpredis のレポジトリをチェックアウトする

home ディレクトリ配下 (`/home/ec2-user/phpredis/`)で作業する想定です。

```
cd
git clone https://github.com/phpredis/phpredis.git
cd phpredis
```

## STEP 4. 2024/1 時点で最新安定版の 6.0.2 をチェックアウトする

```
git checkout tags/6.0.2
```

## STEP 5. コンパイルをすすめる

```
# Run phpize
phpize
# Run configure
./configure
# Run compile
make && sudo make install
```

redis.so が作成されたか確認する

```
ls -al /usr/lib64/php8.2/modules/
```

redis.so ファイルがいるはずです。


## STEP 6. Redis の INI ファイルを追加する

Remi レポジトリに倣って INI を、`50-redis.ini` に作ります。

```
sudo vi /etc/php.d/50-redis.ini
```

以下の内容。いろいろコメントアウトされていますが、1行だけしか使ってないです

```
; Enable redis extension module
extension = redis.so

; phpredis can be used to store PHP sessions.
; To do this, uncomment and configure below

; RPM note : save_handler and save_path are defined
; for mod_php, in /etc/httpd/conf.d/php.conf
; for php-fpm, in /etc/php-fpm.d/*conf

;session.save_handler = redis
;session.save_path = "tcp://host1:6379?weight=1, tcp://host2:6379?weight=2&timeout=2.5, tcp://host3:6379?weight=2"

; Configuration
;redis.arrays.algorithm = ''
;redis.arrays.auth = ''
;redis.arrays.autorehash = 0
;redis.arrays.connecttimeout = 0
;redis.arrays.consistent = 0
;redis.arrays.distributor = ''
;redis.arrays.functions = ''
;redis.arrays.hosts = ''
;redis.arrays.index = 0
;redis.arrays.lazyconnect = 0
;redis.arrays.names = ''
;redis.arrays.pconnect = 0
;redis.arrays.previous = ''
;redis.arrays.readtimeout = 0
;redis.arrays.retryinterval = 0
;redis.clusters.auth = 0
;redis.clusters.cache_slots = 0
;redis.clusters.persistent = 0
;redis.clusters.read_timeout = 0
;redis.clusters.seeds = ''
;redis.clusters.timeout = 0
;redis.pconnect.pooling_enabled = 1
;redis.pconnect.connection_limit = 0
;redis.pconnect.echo_check_liveness = 1
;redis.pconnect.pool_detect_dirty = 0
;redis.pconnect.pool_poll_timeout = 0
;redis.pconnect.pool_pattern => ''
;redis.session.lock_expire = 0
;redis.session.lock_retries = 10
;redis.session.lock_wait_time = 2000
;redis.session.locking_enabled = 0
```

redis が組み込まれたか、確認する

```
php -i | grep redis
```

結果に `/etc/php.d/50-redis.ini` などが載っていればOK

```
/etc/php.d/50-redis.ini
redis
redis.arrays.algorithm => no value => no value
redis.arrays.auth => no value => no value
(省略)
```

## STEP 6. (オプション) PHP-FPM 再起動

Nginx などで、PHP を PHP-FPM のプロセスとして動かしている場合は、再起動して Redis を使えるようにします。

```
sudo systemctl restart php-fpm
```

以上。


繰り返しますが、GitHub の機能要望の[該当 Issue](https://github.com/amazonlinux/amazon-linux-2023/issues/328) がまだオープンだったら、 "I want it too!" とコメントをお願いします！


## STEP 7. アップデートする時

Git で最新版がでていたら、git checkout をまた行って、コンパイルしましょう。

ただ、本番環境でいきなり実施するのは危険です。

開発環境を作成し、そこで試してからアップデートしましょう。

早く、Amazon Linux 2023 公式でサポートしてくれないかな・・・。