↓ 快轉到主要內容
PHP 在Apache 上跑多個版本,以PHP 5.6與PHP 7.1為例
技術文章架站

PHP 在Apache 上跑多個版本,以PHP 5.6與PHP 7.1為例

Posted by Alvin Chen on

PHP 在Apache 上跑多個版本,以PHP 5.6與PHP 7.1為例

·898 字·2 分鐘
作者
Alvin Chen
相信寫 Code 可以改變世界

PHP 在Apache上或者應該說在一台伺服器上通常只會有一個版本,但是有時可能會遇到像是不同的專案需要不同版本,但是卻跑在同一台機器上

這時候就需要多個版本的PHP 支援了

然而這件事情在Windows IIS上很容易的可以用PHP Manager套件直接對不同的站體設定不同版本的PHP

在Linux 上確實沒有這麼容易可以用個小設定就解決,但是也不難就是了,這次要介紹的是php-fpm 的做法

首先,如果你的PHP 版本太舊會建議先升到5.6版,如果不知道怎麼升級請參考上一篇文章 :PHP 版本更新, Apache上如何設定

參考文件 :Run multiple PHP version on the same server using php-fpm and xdebug on Ubuntu 16.04

步驟一 :將要使用的PHP 版本以及相關套件安裝完成
#

sudo su
add-apt-repository ppa:ondrej/php
apt-get update
apt-get install libapache2-mod-fastcgi php5.6-fpm php5.6 php5.6-dev php5.6-mcrypt php5.6-mbstring php5.6-mysql php5.6-zip php5.6-gd php5.6-xml php7.1-fpm libapache2-mod-fastcgi php7.1-fpm php7.1 php7.1-dev php7.1-mbstring php7.1-mysql php7.1-zip php7.1-gd php7.1-xml php7.1-curl php7.1-intl php7.1-json php7.1-mcrypt

這個範例跟上一篇要安裝PHP 5.6時相同,需要先將軟體源ppa:ondrej/php 加入,最後一行指令安裝了很多東西,如果你已經是PHP 5.6

或者透過上一篇的方式升級到PHP 5.6的朋友安裝的時候可以跳過PHP 5.6版的內容,大概會像以下這樣

sudo apt-get install libapache2-mod-fastcgi php5.6-fpm php7.1-fpm libapache2-mod-fastcgi php7.1-fpm php7.1 php7.1-dev php7.1-mbstring php7.1-mysql php7.1-zip php7.1-gd php7.1-xml php7.1-curl php7.1-intl php7.1-json php7.1-mcrypt

但是 php 5.6-fpm還是必須要的!

接下來必須啟用兩個模組

sudo a2enmod actions
sudo a2enmod fastcgi

基本上安裝到這邊結束,接下來就是設定Apache的部分了

步驟二 :設定Apache 虛擬站台config
#

原作者說,需要在每個站台的config 加入下面這段設定值,但是經過測試,有會站台因為這段設定值而無法啟動

所以如果加了這段設定值後無法啟用站台請移除他

<IfModule mod_fastcgi.c>
 AddHandler php56-fcgi-www .php
 Action php56-fcgi-www /php56-fcgi-www
 Alias /php56-fcgi-www /usr/lib/cgi-bin/php56-fcgi-www
 FastCgiExternalServer /usr/lib/cgi-bin/php56-fcgi-www -socket /run/php/php5.6-fpm.sock -pass-header Authorization
 <Directory "/usr/lib/cgi-bin">
  Require all granted
 </Directory>
</IfModule>
<IfModule mod_fastcgi.c>
 AddHandler php71-fcgi-www .php
 Action php71-fcgi-www /php71-fcgi-www
 Alias /php71-fcgi-www /usr/lib/cgi-bin/php71-fcgi-www
 FastCgiExternalServer /usr/lib/cgi-bin/php71-fcgi-www -socket /run/php/php7.1-fpm.sock -idle-timeout 1800 -pass-header Authorization
 <Directory "/usr/lib/cgi-bin">
  Require all granted
 </Directory>
</IfModule>
<IfModule mod_fastcgi.c>
 <FilesMatch ".+\.ph(p[345]?|t|tml)$">
  SetHandler php71-fcgi-www
 </FilesMatch>
</IfModule>

接著,在每個站台的config 加入設定值,指定用哪個版本的PHP來執行

<VirtualHost *:80>
...
<IfModule mod_fastcgi.c>
    <FilesMatch ".+\.ph(p[345]?|t|tml)$">
       SetHandler php56-fcgi-www
    </FilesMatch>
 </IfModule>
...
</VirtualHost>

範例是指定用PHP 5.6來執行所以指定為php 56-fcgi-www

如果要用PHP 7.1 那麼請指定為php 71-fcgi-www

接著重新啟動apache 就可以了

最後來看一下結果是不是對的

首先我們將Config 中的setHandler 設定為php 56-fcgi-www,透過phpinfo() 來看一下實際跑的版本是什麼

php-fpm php 5.6

確實沒有錯,接著變更成7.1

php-fpm php 7.1

也沒有問題,那麼就大功告成了!