CentOS Stream 8のPHPを7.4から8.0にアップグレード

PHP 7.4が2022年11月28日でサポート終了になったのでdnf経由で8.0にアップグレードしたときの覚書。
PHP: Supported Versions

環境: CentOS Stream 8, ImageMagick 6.9.12-67 Q16


1.PHP8.0をインストール

現在のモジュールを確認
# dnf module list php

CentOS Stream 8 - AppStream
Name                         Stream 
php                          7.2 [d]
php                          7.3    
php                          7.4 [e]
php                          8.0
Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled

仮想環境なのでスナップショットをとっておく。

モジュールを7.4から8.0に切り替える
# dnf module reset php
# dnf module enable php:8.0
# dnf --allowerasing distro-sync

確認
# php --version

PHP Warning:  PHP Startup: Unable to load dynamic library 'imagick.so' (tried: /usr/lib64/php/modules/imagick.so (/usr/lib64/php/modules/imagick.so: undefined symbol: instanceof_function), /usr/lib64/php/modules/imagick.so.so (/usr/lib64/php/modules/imagick.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
PHP Warning:  PHP Startup: mecab: Unable to initialize module
Module compiled with module API=20190902
PHP    compiled with module API=20200930
These options need to match
 in Unknown on line 0
PHP 8.0.20 (cli) (built: Jun  8 2022 00:33:06) ( NTS gcc x86_64 )

ImageMagickとMecabのPHPモジュールのアップデートが必要。

まずはphp.dから削除しておく。
# cd /etc/php.d/
# rm -f imagick.ini mecab.ini

ファイル権限が変更されているので再設定
# chown nginx.www -R /var/lib/php/*

nginx用の設定ファイルはいらない
# cd /etc/nginx/conf.d/
# ls
# mv php-fpm.conf bak/

phpの設定確認
# less /etc/php-fpm.d/www.conf
# less /etc/php.ini

upload_max_filesize = 2M
post_max_size = 12M
memory_limit = 256M

WordPressの使用メモリ上限はデフォルトで最大256MB。
参考: WP_MAX_MEMORY_LIMIT – WordPress私的マニュアル


2.php-imagickをビルドしてインストール

ビルドに必要な環境は設定済み。
参考: CentOS Stream8 + ImageMagick + php-imagickをインストール

コマンドを実行するだけ
# pecl install imagick
# echo "extension=imagick.so" > /etc/php.d/imagick.ini

php-fpmを再起動して確認
# systemctl restart php-fpm
# php -i | grep imagick


3.php-mecabをビルドしてインストール

ビルドに必要な環境は設定済み。
参考: CentOS7のPHP 7.2をPHP 7.3にYUM経由でアップデート

php-mecabのPHP8対応しているリポジトリがあったのでそちらに切り替えてビルドする。
元のリポジトリ: rsky/php-mecab: MeCab binding for PHP
切替先: emmatools/php-mecab: MeCab binding for PHP

# cd /opt/software/php-mecab/
# git remote set-url origin https://github.com/emmatools/php-mecab.git
# git pull

ビルド実行
# cd mecab
# make clean
# phpize
# ./configure --with-mecab=/usr/local/bin/mecab-config
# make
# make test
# make install
# echo "extension=mecab.so" > /etc/php.d/mecab.ini

php-fpmを再起動して確認
# systemctl restart php-fpm
# php -i | grep mecab

/etc/php.d/mecab.ini
mecab
mecab.default_dicdir => no value => no value
mecab.default_rcfile => no value => no value
mecab.default_userdic => no value => no value
PWD => /opt/software/php-mecab/mecab
OLDPWD => /opt/software/php-mecab
$_SERVER['PWD'] => /opt/software/php-mecab/mecab
$_SERVER['OLDPWD'] => /opt/software/php-mecab

ん?$_SERVER['PWD']が設定されている。
ちゃんと動作確認する必要がありそう。


4.動作確認

開発環境で動かしてみる。

本番環境でアップグレードしたらログを確認する。
# tail -f /var/log/nginx/error.log


【関連記事】