公司有些 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
。