PHP多版本安装记录

2018-04-03

系统环境:Ubuntu 14.04、apache+php5.5

同时安装多个版本PHP

先添加ppa源

add-apt-repository ppa:ondrej/php
apt-get update

安装php5.5 (默认已存在不用装)

apt-get install -y php5-common php5-mcrypt php5-mysql php5-gd php5-curl php5-json php5-fpm php5-mcrypt libapache2-mod-php5

安装php5.6

apt-get install -y php5.6-common php5.6-mbstring php5.6-mcrypt php5.6-mysql php5.6-xml php5.6-gd php5.6-curl php5.6-json php5.6-fpm php5.6-zip php5.6-intl php5.6-dev libapache2-mod-php5.6

安装php7.0

apt-get install -y php7.0-common php7.0-mbstring php7.0-mcrypt php7.0-mysql php7.0-xml php7.0-gd php7.0-curl php7.0-json php7.0-fpm php7.0-zip php7.0-intl libapache2-mod-php7.0

安装php7.1

apt-get install -y php7.1-common php7.1-mbstring php7.1-mcrypt php7.1-mysql php7.1-xml php7.1-gd php7.1-curl php7.1-json php7.1-fpm php7.1-zip php7.1-intl libapache2-mod-php7.1

安装php7.2

apt-get install -y php7.2-common php7.2-mbstring php7.2-mysql php7.2-xml php7.2-gd php7.2-curl php7.2-json php7.2-fpm php7.2-zip php7.2-intl libapache2-mod-php7.2

注:

PPA包名查找: https://launchpad.net/~ondrej/+archive/ubuntu/php/+packages

切换

打开php5.5

a2dismod php5.6 && a2dismod php7.2 && a2enmod php5 && service apache2 restart

打开php5.6

a2dismod php5 && a2dismod php7.2 && a2enmod php5.6 && service apache2 restart

打开php7.2

a2dismod php5 && a2dismod php5.6 && a2enmod php7.2 && service apache2 restart

开启重定向

a2enmod rewrite
a2enmod headers

同时修改apache2的配置文件

<Directory />
Options FollowSymLinks
AllowOverride None(修改为AllowOverride All)
</Directory>

一个apache同时支持多个版本PHP

为了方便配置,首先把apache升级到 2.4.9 以上(参考这里

把不同vhost的请求分发到不同php-fpm上

注:php-fpm basic auth无法通过认证,解决办法:

Authorization通常出于“安全原因”,Apache模块将剥离标记。我们可以通过env直接将标题传递给PHP来解决此问题:

SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1

1.在VirtualHost配置里添加FilesMatch,用php-fpm来处理php解析请求(也可以把该配置写在.htaccess里):

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html

        <FilesMatch \.php$>
            SetHandler "proxy:unix:/run/php/php5.6-fpm.sock|fcgi://localhost"
        </FilesMatch>
        SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
...

2.启动php-fpm前先关闭php-mod:

a2dismod php5.6

启动php-fpm:

php-fpm5.6

3.在另外VirtualHost同样添加FilesMatch:

<VirtualHost *:8080>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html

        <FilesMatch \.php$>
            SetHandler "proxy:fcgi://127.0.0.1:9150"
        </FilesMatch>
        SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
...

4.编辑并启动php-fpm 7.2版本

打开/etc/php/7.2/fpm/pool.d/www.conf 修改listen为:

listen = 127.0.0.1:9150

启动:

php-fpm7.2

5.最后再启用以下两个模块

a2enmod proxy proxy_fcgi

重启apache就完成了

注意,如果用pecl安装mongodb扩展,会出现两者不能同时兼容,解决办法:

1.先安装一个版本的扩展,比如我们先装5.6扩展

apt remove php7.2-dev
pecl uninstall mongodb
apt install php5.6-dev
pecl install mongodb

1.1 也可以修改php的软链

rm /etc/alternatives/php
ln -s /usr/bin/php5.6 /etc/alternatives/php

2.然后把该mongodb.so文件先备份出来

cp /usr/lib/php/20131226/mongodb.so /home/mongodb-5.6.so

3.再安装7.2扩展

apt install php7.2-dev
pecl uninstall mongodb
pecl install mongodb

4.把刚才备份的5.6扩展放回去

cp /home/mongodb-5.6.so /usr/lib/php/20131226/mongodb.so

5.重启两个php-fpm

killall -USR2 php-fpm5.6
killall -USR2 php-fpm7.2

关于killall信号说明

INT, TERM 立刻终止
QUIT 平滑终止
USR1 重新打开日志文件
USR2 平滑重载所有worker进程并重新载入配置和二进制模块

安装php7.0

1.添加更新源

apt-get install -y language-pack-en-base
LC_ALL=en_US.UTF-8 add-apt-repository ppa:ondrej/php
apt-get update

2.卸载php5

apt-get purge php5 php5-mysql php5-common
apt-get --purge autoremove

3.安装php7

apt-get install php7.0 php7.0-cli php7.0-fpm php7.0-gd php7.0-json php7.0-mysql php7.0-readline

或者

apt-get install php7.0

4.重启apache

service apache2 restart

查询本地包

apt-cache search php7

同时安装php5和php7

不卸载php5也可以,要切换到php7只需改一下配置:

cd /etc/apache2/mods-enabled
rm php5.conf 
rm php5.load 
ln -s ../mods-available/php7.1.load 
ln -s ../mods-available/php7.1.conf 

然后重启apache