公司有些 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 的相关配置。html
默认状况下,php-fpm.conf
里 listen
的默认配置是 127.0.0.1:9000
。由于我这里想要使用多个版本的 PHP
,所以须要改成使用 Unix
套接字。
首先找到 php-fpm 的配置文件:nginx
ps -ef | grep php
能够看到我这里已经开启了两个版本的 php-fpm:segmentfault
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 的相关配置:api
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
)php7
listen = /tmp/php70-php-fpm.sock ··· listen.owner = www listen.group = www listen.mode = 0666
首先找到 Nginx 的配置文件:yii
ps -ef | grep nginx
显示结果为:socket
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
设置的端口改成咱们以前设置的套接字,以下所示:php-fpm
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
打开网页,发现报错 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
。