環境
- CentOS7
(元々色々なバージョンを動かすのに使ってた)
epel, remi のリポジトリの追加は済んでる環境(下記)
yum -y install epel-release
yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
PHP8と諸々インストール
yum -y install php80 php80-php php80-php-mbstring php80-php-pdo php80-php-mysqlnd php80-php-gd php80-php-xml php80-php-fpm
設定
cd /etc/opt/remi/php80/php-fpm.d/
cp -a www.conf www.conf-original
vi www.conf
www.conf
listen = 127.0.0.1:9080
pm = ondemand
いろんなバージョンのPHPを動かしているのでポートはそれぞれ被らないように設定
vi /etc/httpd/conf.d/virtualhost.conf
virtualhost.conf
<Directory "/path/to/php80/document_root">
<FilesMatch \.php$>
SetHandler "proxy:fcgi://localhost:9080" # ← www.conf に指定したポート番号
</FilesMatch>
</Directory>
更新して起動する
service httpd configtest
systemctl start php80-php-fpm
systemctl status php80-php-fpm
systemctl enable php80-php-fpm
systemctl restart httpd
おわり。
Apacheのデフォルトで使用されるバージョンを変える
正解かどうかわからないけど、
PHPのバージョンごとにあるApacheのモジュールを無効化すればOK。
リネームなり削除して読み込まれるモジュールを変える。
なお、複数生きている場合はファイル名昇順で先に来るものが当たる(たぶん)
※ パッケージ更新すると復活するかも…
cd /etc/httpd/conf.modules.d
mv 15-php72-php.conf 15-php72-php.conf_bak
systemctl restart httpd
PHP7のソースをPHP8で動かしてみて引っかかったところと変更内容
自動DI で使ってたリフレクションの一部がコケた
// ↓ NGになった
$tempReflectionClass = $reflectionParameter->getClass();
// ↓ OK
$type = $reflectionParameter->getType();
$tempReflectionClass = $type !== null && !$type->isBuiltin()
? new \ReflectionClass($type->getName())
: null
;
is_callable を静的でないクラスメソッドに対して
クラス名とメソッド名で読んでいたのがNGになった。
// ↓ NGになった
is_callable([クラス名, 静的でないメソッド名]);
// ↓ OK
is_callable([インスタンス, 静的でないメソッド名]);