linux下多版本php共存的原理、方法


零、目標:

服務器當前PHP版本5.4,新項目中使用了Laravel,PHP版本最低要求5.6。希望保持現有應用同時使用PHP5.6.*。也就是說需要兩個版本的PHP同時存在,供nginx根據需要調用不同版本。

一、原理:

Nginx是通過PHP-FastCGI與PHP交互的。而PHP-FastCGI運行后會通過文件、或本地端口兩種方式進行監聽,在Nginx中配置相應的FastCGI監聽端口或文件即實現Nginx請求對PHP的解釋。

既然PHP-FastCGI是監聽端口和文件的,那就可以讓不同版本的PHP-FastCGI同時運行,監聽不同的端口或文件,Nginx中根據需求配置調用不同的PHP-FastCGI端口或文件,即可實現不同版本PHP共存了。

二、方法:

原理很簡單,操作方法其實也很簡單。

1.php-fpm監聽不同端口,如9000(默認)、9001

2.Nginx配置調用端口,(9000,9001)

第一步,PHP編譯安裝的話,php-fpm配置文件路徑一般是 /PHP_INSTALLED_PATH/etc/php-fpm.conf (php剛編譯安裝完時配置文件名為php-fpm.default.conf,直接改名為php-fpm.conf即可),當然這個路徑是編譯時配置的,上面這個路徑算是最佳實踐吧。

下面這里即是配置監聽端口的地方,此處端口9000改為9001,其他配置參考舊版本php-fpm.conf的配置即可。

listen = 127.0.0.1:9000 #fpm監聽端口,即nginx中php處理的地址,一般默認值即可。可用格式為: 'ip:port', 'port', '/path/to/unix/socket'. 每個進程池都需要設置.

注意,如果是要安裝5.2及以前版本需要打php-fpm補丁,下載fpm補丁包並執行命令 gzip -cd php-5.2.14-fpm-0.5.14.diff.gz | patch -d php-5.2.14 -p1

第二步,修改Nginx vhost.conf配置文件,添加如下部分:

 

 1 server {    
 2     listen       80;     
 3     server_name  a.b.com;        
 4     index index.html index.htm index.php;                    
 5     root /MY_PROJECT_PATH;
 6 
 7     location / {             
 8            try_files $uri $uri/ /index.php?$query_string;         
 9     }         
10     location ~ .*\.(php|php5)?$         {                 
11         #fastcgi_pass  unix:/tmp/php-cgi.sock;                
12         fastcgi_pass  127.0.0.1:9001;                
13         fastcgi_index index.php;                 
14         include fastcgi.conf;        
15     }
16 }

上面9001部分即是將所有.php和.php5文件請求都轉發到9001端口。

第三步、啟動新版php-fpm,重啟nginx。

php-fpm支持的操作:

  • start,啟動PHP的FastCGI進程。
  • stop,強制終止PHP的FastCGI進程。
  • quit,平滑終止PHP的FastCGI進程。
  • restart, 重啟PHP的FastCGI進程。
  • reload, 重新加載PHP的php.ini。
  • logrotate, 重新啟用log文件。

常見錯誤1:php-fpm start啟動后通過瀏覽器訪問項目出現502BAD GATEWAY,查看netstat -ano發現並沒有監聽到9001端口的程序,應該是php-fpm啟動出錯。

查資料發現可以通過指定配置文件來啟動php-fpm,命令如下:

#測試php-fpm配置
/usr/local/php/sbin/php-fpm -t /usr/local/php/sbin/php-fpm -c /usr/local/php/etc/php.ini -y /usr/local/php/etc/php-fpm.conf -t   #啟動php-fpm /usr/local/php/sbin/php-fpm /usr/local/php/sbin/php-fpm -c /usr/local/php/etc/php.ini -y /usr/local/php/etc/php-fpm.conf 

指定配置文件后啟動正常,正確監聽9001端口

 

常見錯誤2:

  1. ERROR: [pool www] cannot get uid for user '@php_fpm@
  2. ERROR: FPM initialization failed  

解決辦法是修改php-fpm.conf中user和group部分為系統用戶的名字,如root或www(應用這個,root千萬別用,權限太大)

 

通過以上三步便實現了Linux上多版本PHP共存,不過這個前提是服務器上已經安裝了兩個版本的PHP。

如果對PHP編譯安裝不清楚或者遇到了問題,可以看這篇文章:

 PHP編譯安裝、常用配置及常見錯誤


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM