前言
公司有些 Yii2 项目的验证码组件不显示图片了,经排查后发现原来是由于前阵子测试环境上 PHP 版本升级导致的。原来 Yii 2.0.13
版本之前都会使用 \yii\base\Object
类,而 Object 在 PHP 7.2
之后变作保留关键字,作为类名会报错。具体消息可参考文档:《Yii 2.0 的 API 文档》。好了,找到问题之后,就该着手解决啦。
安装多个版本的 PHP
目前公司服务器上使用的是 CentOS7,已使用 yarn 安装了 PHP 7.2.30,因此我只需要再安装一个较低版本的 PHP。使用 yarn 安装 PHP 可参考我的上篇文章:《Laravel 项目部署,php-fpm 及 nginx 配置》,这里就不再赘述。注意安装的时候不要影响到之前的 PHP,必要的时候可以备份一下 PHP 和 Nginx 的相关配置。
让PHP-FPM 使用 Unix 套接字
默认情况下,php-fpm.conf
里 listen
的默认配置是 127.0.0.1:9000
。因为我这里想要使用多个版本的 PHP
,因此需要改为使用 Unix
套接字。
首先找到 php-fpm 的配置文件:
ps -ef | grep php
可以看到我这里已经开启了两个版本的 php-fpm:
root 13124 1 0 18:33 ? 00:00:00 php-fpm: master process (/etc/opt/remi/php70/php-fpm.conf)
root 28862 1 0 11:31 ? 00:00:00 php-fpm: master process (/etc/opt/remi/php72/php-fpm.conf)
进入到 /etc/opt/remi/php70
文件夹中,可以找到该版本 PHP 的相关配置:
drwxr-xr-x. 2 root root 6 Feb 20 2019 opt
drwxr-xr-x. 2 root root 4096 Apr 26 16:39 php.d
-rw-r--r--. 1 root root 4103 Apr 14 16:23 php-fpm.conf
drwxr-xr-x. 2 root root 40 Apr 26 18:29 php-fpm.d
-rw-r--r--. 1 root root 60621 Apr 26 18:32 php.ini
drwxr-xr-x. 2 root root 6 Feb 20 2019 pki
drwxr-xr-x. 5 root root 49 Apr 26 16:19 pm
drwxr-xr-x. 2 root root 6 Feb 20 2019 skel
drwxr-xr-x. 2 root root 20 Apr 26 18:04 sysconfig
drwxr-xr-x. 4 root root 36 Apr 26 16:19 X11
drwxr-xr-x. 3 root root 22 Apr 26 16:19 xdg
drwxr-xr-x. 2 root root 6 Feb 20 2019 xinetd.d
其中 php-fpm 的配置就在 php-fpm.d
文件夹下的 www.conf
中,内容如下:
listen = 127.0.0.1:9000
···
;listen.owner = nobody
;listen.group = nobody
;listen.mode = 0660
把 listen
改为 sock 文件名,更改后结果如下:(我这里起名叫做 /tmp/php70-php-fpm.sock
)
listen = /tmp/php70-php-fpm.sock
···
listen.owner = www
listen.group = www
listen.mode = 0666
更改 Nginx 配置
首先找到 Nginx 的配置文件:
ps -ef | grep nginx
显示结果为:
root 13114 1 0 18:32 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
查看文件 /usr/local/nginx/conf/nginx.conf
后,发现我们服务器上每个项目的配置文件为 /usr/local/nginx/conf/vhost/xxx.conf
,打开后更改配置,将fastcgi_pass
设置的端口改为我们之前设置的套接字,如下所示:
location ~ [^/]\.php(/|$)
{
try_files $uri =404;
fastcgi_pass unix:/tmp/php70-php-fpm.sock;(更改这里)
fastcgi_index index.php;
include fastcgi.conf;
}
接下来只需要重启 PHP-FPM 和 Nginx 即可:
systemctl restart php70-php-fpm.service
systemctl restart nginx.service
PHP-FPM 没有生成 socket 文件
打开网页,发现报错 502,查看 nginx 日志后,发现报了这么一行错误:
connect() to unix:/tmp/php70-php-fpm.sock failed (2: No such file or directory) while connecting to upstream
查看 /tmp
文件夹,发现并没有 php70-php-fpm.sock
文件。
查找 php70-php-fpm.service
配置:
find / -name "php70-php-fpm.service"
打开 php70-php-fpm.service
,发现其中 PrivateTmp
项设置为 true,改为 false 即可:
[Unit]
Description=The PHP FastCGI Process Manager
After=syslog.target network.target
[Service]
Type=notify
EnvironmentFile=/etc/opt/remi/php70/sysconfig/php-fpm
ExecStart=/opt/remi/php70/root/usr/sbin/php-fpm --nodaemonize
ExecReload=/bin/kill -USR2 $MAINPID
PrivateTmp=false
[Install]
WantedBy=multi-user.target
然后记得再重启一下 PHP-FPM,再去看发现已经生成了 /tmp/php70-php-fpm.sock
文件。如果没有生成,可以参考一下 《PHP-FPM 没有生成 socket 文件》这篇文章,看看是哪里的问题。
如果发现报错:
connect() to unix:/tmp/php70-php-fpm.sock failed (13: Permission denied) while connecting to upstream
可能是因为用户/用户组权限的问题,可尝试更改 PHP-FPM
配置文件中的 listen.owner
和 listen.group
。