CentOS Stream 9 にPHP8.1をDNFでインストール

アフィリエイト広告を利用しています

このページの内容が役に立ったら X (旧twitter) でフォローして頂けると励みになります
挨拶や報告は無しで大丈夫です

さくらのVPSにCentOS Stream 9をインストールした覚書です。

今回は、PHPの最新版であるPHP8.1をインストールします。

ソースインストールではなく、 dnf インストールですので、ソースインストールをお探しの場合は下記をご覧ください。
CentOS Stream 8にPHP8.0.11をソースインストール

なお本番環境で利用される場合はここにある内容だけを鵜呑みにせずセキュリティ専門家に相談されることをお勧めします。

環境

実施日2022-03-27
サーバさくらのVPS 2G
OS CentOS Stream 9
cat /etc/redhat-release
CentOS Stream release 9

PHP8.1のインストール

remiからインストールします。

remiをまだ設定していない場合はこちら

選択可能なバージョンを確認してみます。

dnf module list php
Last metadata expiration check: 1:20:55 ago on Mon 28 Mar 2022 10:06:10 PM JST.
Remi's Modular repository for Enterprise Linux 9 - x86_64
Name                                  Stream                                   Profiles                                                   Summary
php                                   remi-7.4                                 common [d], devel, minimal                                 PHP scripting language
php                                   remi-8.0                                 common [d], devel, minimal                                 PHP scripting language
php                                   remi-8.1                                 common [d], devel, minimal                                 PHP scripting language

7.4 から 8.1 までが選択できるようになっています。

ということで、PHP8.1 をインストールします。

dnf module install php:remi-8.1

次のようなエラーが出るときは、mbstring なので oniguruma します。

Error:
 Problem: cannot install the best candidate for the job
  - nothing provides libonig.so.105()(64bit) needed by php-mbstring-8.1.4-1.el9.remi.x86_64
(try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)
# 鬼車をインストール
dnf --enablerepo=remi install oniguruma5php

# php をインストール
dnf module install php:remi-8.1

余談 (必要になったときに再確認します)
▼でバージョンの切り替え

dnf module reset php:remi-8.1
dnf module install php:remi-8.0

確認

# バージョン
php -v

# php.ini の場所
php -i | grep php.ini

# php-fpm の場所
which php-fpm

# php-fpm のバージョン
php-fpm -v

php-fpm の設定

# 現在の状態を確認
systemctl status php-fpm

# 起動
systemctl start php-fpm

# 終了
systemctl stop php-fpm

# 自動起動の有効化
systemctl enable php-fpm

# 自動起動の解除
systemctl disable php-fpm

php-zip

dnf --enablerepo=remi install php-zip

PHPを実行して、次のようなエラーが出た場合にインストールします。
zip機能を使わないPHPプログラムだとインストールしなくてもOKです。

PHP Fatal error:  Uncaught Error: Class 'ZipArchive' not found in ・・・

php-bcmath

dnf --enablerepo=remi install php-bcmath

# エラーになった場合はこちらを試す
# dnf --enablerepo=epel,remi install php-bcmath

PHPを実行して、次のようなエラーが出た場合にインストールします。
GA4を使うために composer から google/analytics-data を使う場合に必要になります。

PHP Fatal error:  Uncaught Error: Call to undefined function bccomp() in ・・・

mysql

dnf --enablerepo=remi install php-mysqlnd

gd

dnf --enablerepo=remi install php-gd

image magick

# PowerTools は無くても良さそう。ってか、Stream 9 からは PowerTools が無い?
dnf --enablerepo=epel install ImageMagick ImageMagick-devel

dnf install php-devel php-pear make

pecl install imagick
Please provide the prefix of Imagemagick installation [autodetect] : /usr/local/ImageMagick-6.9.12
Build process completed successfully
Installing '/usr/lib64/php/modules/imagick.so'
Installing '/usr/include/php/ext/imagick/php_imagick_shared.h'
install ok: channel://pecl.php.net/imagick-3.7.0
configuration option "php_ini" is not set to php.ini location
You should add "extension=imagick.so" to php.ini
vi /etc/php.ini
extension=imagick.so

アップデートでエラーが出る場合は下記を参考にしてください。
ImageMagickが原因でDNFのアップデートがエラーになったときの対処

その他

必要に応じて

dnf --enablerepo=remi install php-opcache
dnf --enablerepo=remi install php-pecl-apcu
dnf --enablerepo=remi install php-pear
dnf --enablerepo=remi install php-xmlrpc
dnf --enablerepo=remi install php-intl

# mcrypt はPHP7.2以降で廃止
# dnf --enablerepo=remi install php-pecl-mcrypt

php.iniを設定

# タイムゾーンを Asia/Tokyo に変更
sed -i -e "s/^;date\.timezone =[^A-Za-z]*$/date.timezone =/g" /etc/php.ini
sed -i -e "s/^date\.timezone =[^A-Za-z]*$/date.timezone = Asia\/Tokyo/g" /etc/php.ini

# OPcacheの設定 (公式のデフォルトで設定)
# http://php.net/manual/ja/opcache.installation.php
sed -i -e "s/^;opcache.memory_consumption=/opcache.memory_consumption=/g" /etc/php.d/10-opcache.ini
sed -i -e "s/^;opcache.interned_strings_buffer=/opcache.interned_strings_buffer=/g" /etc/php.d/10-opcache.ini
sed -i -e "s/^;opcache.max_accelerated_files=/opcache.max_accelerated_files=/g" /etc/php.d/10-opcache.ini
sed -i -e "s/^;opcache.revalidate_freq=/opcache.revalidate_freq=/g" /etc/php.d/10-opcache.ini
sed -i -e "s/^;opcache.enable_cli=/opcache.enable_cli=/g" /etc/php.d/10-opcache.ini

vi /etc/php.d/10-opcache.ini
opcache.fast_shutdown=1
が無いと思うので末尾あたりに追記する
# 次の3つの .sock は yum でMySQLをインストールした場合の位置
sed -i -e "s/^mysql\.default_socket =$/mysql.default_socket = \/var\/lib\/mysql\/mysql.sock/g" /etc/php.ini
sed -i -e "s/^mysqli\.default_socket =$/mysqli.default_socket = \/var\/lib\/mysql\/mysql.sock/g" /etc/php.ini
sed -i -e "s/^pdo_mysql\.default_socket=$/pdo_mysql.default_socket = \/var\/lib\/mysql\/mysql.sock/g" /etc/php.ini

確認

# php.iniのタイムゾーン
grep -E 'date.timezone|default_socket' /etc/php.ini

# php.ini
vi /etc/php.ini

バージョン

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
    with Zend OPcache v8.1.4, Copyright (c), by Zend Technologies

定期的なメンテナンス

dnf update --enablerepo=epel,remi

dnf update でエラーになる場合は下記をお試しください
スクリプトにして cron で自動化しても良いです

dnf update mysql-community-server

# ▲で GPGエラーになる場合
ls -la /etc/pki/rpm-gpg/

wget -O /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2023 https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2023

ls -la /etc/pki/rpm-gpg/

vi /etc/yum.repos.d/mysql-community.repo
2023 に書き換える

dnf clean all

dnf update mysql-community-server

dnf --enablerepo=remi install したものを定期的に update します。
dnf update には含まれないものなので別途行う必要があります。

dnf --enablerepo=remi update php-zip
dnf --enablerepo=remi update php-bcmath
dnf --enablerepo=remi update php-mysqlnd
dnf --enablerepo=remi update php-gd
dnf --enablerepo=remi update php-opcache
dnf --enablerepo=remi update php-pecl-apcu
dnf --enablerepo=remi update php-pear
dnf --enablerepo=remi update php-xmlrpc
dnf --enablerepo=remi update php-intl