◆ 公式サイトの方法だとビルドすることになる
◆ パッケージマネージャーを使うなら remi からインストールできる
◆ remi-safe だと /opt/remi 以下にバージョンごとにインストールされる
◆ remi-phpXX だと標準のバージョンを置き換えてインストールされる

最近はほぼ PHP を使ってなくて ちょっと機能を試してみるくらいなら Docker の php イメージを実行するくらいでした
CentOS へのインストールはなにか変わってたりするのかなと久々に試してみました

公式サイトの配布

そういえば公式サイトは充実してるのに 公式サイトのインストール手順って読んだ覚えがなかったので見てみました
https://www.php.net/manual/ja/install.unix.php

基本は .tar.gz 形式のソースコードをダウンロードして make, make install みたいです
Debian ではパッケージマネージャーの apt を使う方法が紹介されてましたが 非公式のサードパーティビルドで公式サポートはしてないという警告付きでした
rpm 系は紹介もされてないようです

この方法だとビルドが必要なので 公式サイトの方法は使わずパッケージマネージャから入れようと思います

CentOS 7

もう次の CentOS 8 が出てますが CentOS 8 は 2021 年でサポート終了で CentOS 8 Stream にしても CentOS 7 より 1 ヶ月短いサポート期間です
CentOS 代替ディストリビューションが安定するまでは CentOS 7 でもいいかと思います

試したバージョンは 7.9 です
yum で普通に php を入れると

php 5.4.16-48.el7

でした
かなり古いですね

バージョン管理ツール

標準のバージョン以外を入れるなら Node.js で使われるようなバージョン管理ツールを使うこともできます
ただ PHP ではあまり有名ではなさそうですし 以前は使ってみたことがあったのですが 長続きしませんでした
そもそも バージョンを頻繁に切り替えたいわけではなく最新版を入れたいだけですし

remi

それ以外の方法では yum のリポジトリを追加して yum からインストールする方法があります
ただ PHP では公式で rpm リポジトリが公開されていません

昔使ったときは remi というのを使ったので 調べてみたところ今でもこれが使われることが多いようです
調べてみると 非公式で個人で管理してるリポジトリらしいです
https://blog.remirepo.net/

そう聞くと不安もありますが 開発時のお試しだけでなく実際のサービスでもここのパッケージが使われてるみたいですし 実質標準みたいな感じなのでしょう
CentOS 用 RPM は RHEL 用と同じなのでリポジトリのページの Enterprise Linux 7 にある rpm ファイルをインストールします

yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm

「EPEL を先に入れないといけない」 と書いてる記事も見かけますが 依存関係として自動でインストールされるので これだけで十分です
こういう感じでインストールされます

Installed:
remi-release.noarch 0:7.9-1.el7.remi

Dependency Installed:
epel-release.noarch 0:7-11

インストール後に /etc/yum.repos.d/ を見ると remi 関係のファイルが色々増えてます

# ls /etc/yum.repos.d/
CentOS-Base.repo CentOS-fasttrack.repo remi-glpi93.repo remi-php72.repo
CentOS-CR.repo CentOS-x86_64-kernel.repo remi-glpi94.repo remi-php73.repo
CentOS-Debuginfo.repo epel-testing.repo remi-modular.repo remi-php74.repo
CentOS-Media.repo epel.repo remi-php54.repo remi-php80.repo
CentOS-Sources.repo remi-glpi91.repo remi-php70.repo remi-safe.repo
CentOS-Vault.repo remi-glpi92.repo remi-php71.repo remi.repo

ただデフォルトで有効なのは remi-safe のみのようです
remi-safe だけでも 各バージョンの PHP をインストールできます
「yum search php」 を実行すると 全部のバージョンが見つかります

8.0 をインストールするので

yum install php80

を実行します
インストールされた php コマンドは php80 のようにバージョン付きになっています

# php80 -a
Interactive shell

php > echo phpversion();
8.0.6

remi-safe のインストール内容

インストール場所は /opt/remi/ 以下になっています

# ll /usr/bin/php80
lrwxrwxrwx 1 root root 32 May 18 05:04 /usr/bin/php80 -> /opt/remi/php80/root/usr/bin/php

# ll /opt
total 8
drwxr-xr-x 3 root root 4096 May 18 05:04 remi
drwxr-xr-x 2 root root 4096 Oct 30 2018 rh

# ll /opt/remi
total 4
dr-xr-xr-x 3 root root 4096 May 18 05:04 php80

# ll /opt/remi/php80
total 8
-rw-r--r-- 1 root root 242 Apr 9 2020 enable
dr-xr-xr-x 15 root root 4096 May 18 05:04 root

# ll /opt/remi/php80/root/
total 52
lrwxrwxrwx 1 root root 7 May 18 05:04 bin -> usr/bin
dr-xr-xr-x 2 root root 4096 Apr 9 2020 boot
drwxr-xr-x 2 root root 4096 Apr 9 2020 dev
drwxr-xr-x 2 root root 4096 Apr 9 2020 home
lrwxrwxrwx 1 root root 7 May 18 05:04 lib -> usr/lib
lrwxrwxrwx 1 root root 9 May 18 05:04 lib64 -> usr/lib64
drwxr-xr-x 2 root root 4096 Apr 9 2020 media
drwxr-xr-x 2 root root 4096 Apr 9 2020 mnt
drwxr-xr-x 2 root root 4096 Apr 9 2020 opt
dr-xr-xr-x 2 root root 4096 Apr 9 2020 proc
dr-xr-x--- 2 root root 4096 Apr 9 2020 root
drwxr-xr-x 3 root root 4096 May 18 05:04 run
lrwxrwxrwx 1 root root 8 May 18 05:04 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Apr 9 2020 srv
drwxr-xr-x 2 root root 4096 Apr 9 2020 sys
drwxrwxrwt 2 root root 4096 Apr 9 2020 tmp
drwxr-xr-x 13 root root 4096 May 18 05:04 usr

# ll /opt/remi/php80/root/bin/
total 12488
lrwxrwxrwx 1 root root 9 May 18 05:04 phar -> phar.phar
-rwxr-xr-x 1 root root 15394 May 5 04:58 phar.phar
-rwxr-xr-x 1 root root 6380856 May 5 04:58 php
-rwxr-xr-x 1 root root 6380216 May 5 04:58 php-cgi
-rwxr-xr-x 1 root root 4886 May 5 04:58 phpize

バージョンごとのフォルダがあって その中の root フォルダ内に bin や home など Linux のルートフォルダのようなものが作られてます
ここには PHP の動作に必要なファイルのみがあるようです

remi 内の root フォルダには etc と var フォルダが見当たりませんが これらは /etc/opt や /var/opt の中に remi フォルダが作られて この中にあります

# ll /etc/opt/remi/php80/
total 100
drwxr-xr-x 4 root root 4096 May 18 05:04 X11
drwxr-xr-x 2 root root 4096 Apr 9 2020 opt
drwxr-xr-x 2 root root 4096 May 18 05:04 php.d
-rw-r--r-- 1 root root 62812 May 5 04:58 php.ini
drwxr-xr-x 2 root root 4096 Apr 9 2020 pki
drwxr-xr-x 5 root root 4096 May 18 05:04 pm
drwxr-xr-x 2 root root 4096 Apr 9 2020 skel
drwxr-xr-x 2 root root 4096 Apr 9 2020 sysconfig
drwxr-xr-x 3 root root 4096 May 18 05:04 xdg
drwxr-xr-x 2 root root 4096 Apr 9 2020 xinetd.d

# ll /var/opt/remi/php80/
total 64
drwxr-xr-x 2 root root 4096 Apr 9 2020 adm
drwxr-xr-x 2 root root 4096 Apr 9 2020 cache
drwxr-xr-x 2 root root 4096 Apr 9 2020 db
drwxr-xr-x 2 root root 4096 Apr 9 2020 empty
drwxr-xr-x 2 root root 4096 Apr 9 2020 games
drwxr-xr-x 2 root root 4096 Apr 9 2020 gopher
drwxr-xr-x 7 root root 4096 May 18 05:04 lib
drwxr-xr-x 2 root root 4096 Apr 9 2020 local
drwxr-xr-x 3 root root 4096 May 18 05:20 log
lrwxrwxrwx 1 root root 10 May 18 05:04 mail -> spool/mail
drwxr-xr-x 2 root root 4096 Apr 9 2020 nis
drwxr-xr-x 2 root root 4096 Apr 9 2020 opt
drwxr-xr-x 2 root root 4096 Apr 9 2020 preserve
drwxr-xr-x 3 root root 4096 May 18 05:20 run
drwxr-xr-x 4 root root 4096 May 18 05:04 spool
drwxrwxrwt 2 root root 4096 Apr 9 2020 tmp
drwxr-xr-x 2 root root 4096 Apr 9 2020 yp

php80-php でインストールされるのは最低限のものだけなので mbstring など追加モジュールをインストールするなら 「php80-」 プレフィックス付きのパッケージをインストールします

php80-php-mbstring
php80-php-gd
php80-php-pdo

など

remi-php80 を使う

remi-safe を使わずに remi-php80 を使うと CentOS 標準の php を置き換える形でインストールされて opt/remi フォルダは作られません
コマンドも php となっています
そのほうが好みならこういうコマンドでインストールできます

yum install --disablerepo=remi-safe --enablerepo=remi-php80 php

apache から実行する

remi-safe でインストールした php80 を apache から実行できるようにします
httpd と php-fpm をインストールします

yum install httpd php80-php-fpm

php-fpm はデフォルトでは 127.0.0.1:9000 を listen する設定です

# cat /etc/opt/remi/php80/php-fpm.d/www.conf
(略)

; The address on which to accept FastCGI requests.
; Valid syntaxes are:
; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on
; a specific port;
; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
; a specific port;
; 'port' - to listen on a TCP socket to all addresses
; (IPv6 and IPv4-mapped) on a specific port;
; '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = 127.0.0.1:9000
(略)

fedora だとデフォルトが unix socket を使ってたと思います
今回はこのまま port の listen のままにします

remi の php-fpm では httpd の php.conf ファイルを作ってくれないようなので 自作します

[/etc/httpd/conf.d/php.conf]
<FilesMatch \.php$>
SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>

これで apache と php-fpm を起動させれば PHP が動くはずです

# cat /var/www/html/a.php
<?php
echo 1 + 1;

# curl http://localhost/a.php
2

CentOS 8

次は CentOS 8 です
デフォルトで php をインストールしようとすると バージョンは

php 7.2.24-1.module_el8.2.0+313+b04d0a66

でした

CentOS 8 では dnf の module 機能が使えて バージョンを切り替えできます
php の一覧をみると

# dnf module list php
Failed to set locale, defaulting to C.UTF-8
Last metadata expiration check: 0:01:49 ago on Tue May 18 07:03:25 2021.
CentOS Linux 8 - AppStream
Name Stream Profiles Summary
php 7.2 [d] common [d], devel, minimal PHP scripting language
php 7.3 common [d], devel, minimal PHP scripting language
php 7.4 common [d], devel, minimal PHP scripting language

7.4 まではありますが残念ながら最新の 8 はないようです

remi

仕方ないので今回も remi リポジトリを追加します
remi の追加は CentOS7 のときの URL の 7 を 8 にするだけです

dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm

CentOS7 よりも yum.repos.d の中身がスッキリしてます

# ls /etc/yum.repos.d/
CentOS-Linux-AppStream.repo CentOS-Linux-Extras.repo CentOS-Linux-PowerTools.repo epel-testing.repo
CentOS-Linux-BaseOS.repo CentOS-Linux-FastTrack.repo CentOS-Linux-Sources.repo epel.repo
CentOS-Linux-ContinuousRelease.repo CentOS-Linux-HighAvailability.repo epel-modular.repo remi-modular.repo
CentOS-Linux-Debuginfo.repo CentOS-Linux-Media.repo epel-playground.repo remi-safe.repo
CentOS-Linux-Devel.repo CentOS-Linux-Plus.repo epel-testing-modular.repo remi.repo

バージョンごとの .repo ファイルがなくなり modular にまとまったみたいです
module のリストに remi が増えています

# dnf module list php
Failed to set locale, defaulting to C.UTF-8
Last metadata expiration check: 0:03:33 ago on Tue May 18 07:08:16 2021.
CentOS Linux 8 - AppStream
Name Stream Profiles Summary
php 7.2 [d] common [d], devel, minimal PHP scripting language
php 7.3 common [d], devel, minimal PHP scripting language
php 7.4 common [d], devel, minimal PHP scripting language

Remi's Modular repository for Enterprise Linux 8 - x86_64
Name Stream Profiles Summary
php remi-7.2 common [d], devel, minimal PHP scripting language
php remi-7.3 common [d], devel, minimal PHP scripting language
php remi-7.4 common [d], devel, minimal PHP scripting language
php remi-8.0 common [d], devel, minimal PHP scripting language

CentOS7 のときと同じく こっちは使わずデフォルトの remi-safe から php80 をインストールします

dnf install php80

インストールすると CentOS7 のときと同じように /opt/remi や /etc/opt/remi フォルダができています
このあたりに違いはなさそうです

apache から実行する

apache との連携は CentOS7 と違っていました
php80-php-fpm をインストールすると 「/etc/httpd/conf.d/php80-php.conf」 ができていました
ただし httpd パッケージは入らないので httpd は自分でインストールする必要があります

内容はこういう感じで unix socket を使うようになってました

(略)
# Redirect to local php-fpm if mod_php (5, 7 or 8) is not available
<IfModule !mod_php5.c>
<IfModule !mod_php7.c>
<IfModule !mod_php.c>
# Enable http authorization headers
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1

<FilesMatch \.(php|phar)$>
SetHandler "proxy:unix:/var/opt/remi/php80/run/php-fpm/www.sock|fcgi://localhost"
</FilesMatch>
</IfModule>
</IfModule>
</IfModule>

自分で設定ファイルを書かなくてもインストールしてサービスを起動するだけで使えるので楽ですね