PHP8(PHP-FPM)的备注
环境
-
- 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
listen = 127.0.0.1:9080
pm = ondemand
因为在运行各种不同版本的PHP,所以需要设置不同的端口以避免冲突。
vi /etc/httpd/conf.d/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模块即可。
更改被重命名或删除的模块以进行加载。
如果存在多个模块,按照文件名的升序排列选择先出现的(可能的情况)。
※ 如果更新包,可能会复原。
cd /etc/httpd/conf.modules.d
mv 15-php72-php.conf 15-php72-php.conf_bak
systemctl restart httpd
尝试在PHP8中运行PHP7的源码时遇到问题和修改内容。
我的自動DI使用中的反射部分出了問題。
// ↓ NGになった
$tempReflectionClass = $reflectionParameter->getClass();
// ↓ OK
$type = $reflectionParameter->getType();
$tempReflectionClass = $type !== null && !$type->isBuiltin()
? new \ReflectionClass($type->getName())
: null
;
对于非静态类方法的 is_callable,在使用类名和方法名进行调用时,变成了不可行。
// ↓ NGになった
is_callable([クラス名, 静的でないメソッド名]);
// ↓ OK
is_callable([インスタンス, 静的でないメソッド名]);