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