摘要訊息 : 在 CentOS 7 下實現多個版本的 PHP 共存.
0. 前言
现在网路上还是存在不少旧的 PHP 程式是不支援 PHP 7 甚至 PHP 8 的, 所以这个时候我们可能需要安装 PHP 5.x. 在网上搜了一下, 没有搜到很好的教程, 很多教程安装下来都有很多莫名其妙的错误, 所以决定自己动手实践. 因为已经存在一个 PHP 7 了, 所以这里采用编译安装的方法来安装 PHP 5.
大家可以在 https://www.php.net/releases/ 中找到所有已经发布的 PHP 版本, 按下 CTRL (control) + F 就可以搜寻你想要的版本, 比如我想要最新版本的 PHP 5.6, 那么我只需要搜寻 "5.6" 就可以找到 PHP 5.6.41, 获取到真实的下载地址之后使用 wget
指令下载到伺服器即可. 下载之后, 由于 PHP 的压缩包是 .tar.gz 的形式, 所以我们使用指令 tar zxvf php-5.6.41.tar.gz
(或者使用 tar zxvf php-*.tar.gz
) 来解压缩.
因此文中的图像都是 2017 年的, 所以本文将把当时最新的 PHP 5.6.30 安装在 /usr/local/
中.
本文在 2022 年 1 月 21 日进行一次更新和修正. 修正之后本文已经归档, 不再享受更新. 另外, PHP 官方针对 PHP 5 的支援已经到期, 请大家尽量使用更新版本的 PHP 8 或者 PHP 7.
1. 安装
在解压完成之后, 我们首先进入 PHP 5 的安装档案夹 cd php-*
(这里的 "*
" 代表通用匹配, 只要目前档案夹下只下载了一个 PHP 版本, 那么就可以用这个指令进入, 否则请明确指出路径 cd php-5.6.41
). PHP 5 的安装由于采用编译安装, 所以会比 PHP 7 的 yum
安装要麻烦一点, 这里首先需要安装环境和依赖 : yum install -y gcc gcc-c++ libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel curl curl-devel openssl openssl-devel sqlite-devel bzip2-devel libXpm-devel libmcrypt libmcrypt-devel libcurl libcurl-devel libicu libicu-devel icu
.
然后我们使用档案夹中 configure
进行安装配置 :
./configure --prefix=修改为安装 PHP 5 的档案夹 --enable-fpm --with-mysql --with-mysqli --with-zlib --with-curl --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-openssl --enable-mbstring --enable-xml --enable-session --enable-ftp --enable-pdo --enable-mbregex --enable-phar --enable-posix --enable-soap --enable-sockets --enable-sysvsem --enable-sysvshm --enable-zip --enable-inline-optimization --enable-intl --with-icu-dir=/usr --with-gd --with-xpm-dir --with-bz2 --with-gettext --with-iconv --with-mcrypt --with-mhash --with-zlib --with-pcre-regex --with-regex
这里包含了很多组建, 可以通过自己的需要只挑选自己需要的组件. 看到和如下差不多的图表示配置已经完成 :
接下来使用指令 make
进行编译. 根据你的 CPU 性能, 这一步花费的时间比较长, 耐心等待就可以了. 如果你的 CPU 支援多核心多执行绪, 那么可以使用 make -j8
这样的指令加快速度. 我的伺服器 CPU 最高支援 32 个执行绪, 因此我可以直接使用 make -j32
来最快速地进行编译. 如果结果类似于下面这张图就说明已经编译成功了 :
这里特别指出, PHP 5.4 安装的时候, 可能会提示 configure: error: libXpm.(a|so) not found
. 这是因为我们的系统是 64 位的, 需要执行下面的命令 : ln -s /usr/lib64/libXpm.so* /usr/lib/
. 然后重新执行 make
指令就可以了.
接下来使用指令 make install
安装就可以了. 当然, Figure 2 中的最后有一句提示, 让我们使用 make test
进行测试, 对于 PHP 大型的程式, 实际上是没有必要浪费这种时间的, 因为官方早就帮我们测试好了. 安装完成之后你便会看到 :
现在要对一些文件进行配置. 首先创建 PHP 配置文件 cp php.ini-development /usr/local/php5/lib/php.ini
, 并且编辑 vi /usr/local/php5/lib/php.ini
: 找到 mysql.default_socket
修改为 mysql.default_socket = /var/lib/mysql/mysql.sock
; 找到 date.timezon
e, 去掉前面的分号并且修改为 date.timezone = Asia/Hong_Kong
(或者你可以在 https://www.php.net/manual/zh/timezones.php 找到自己的时区).
然后配置 PHP-FPM. 首先创建 PHP-FPM 的配置文件 cp /usr/local/php5/etc/php-fpm.conf.default /usr/local/php5/etc/php-fpm.conf
, 并且编辑 vi /usr/local/php5/etc/php-fpm.conf
: 找到 user = none
和 group = none
改为 user = nginx
和 group = nginx
(前提是你是根据 Jonny'Blog 给出的方法安装的 Nginx, 否则请你根据当时的安装情况进行修改); 找到 listen = 127.0.0.1:9000
改为 listen = 127.0.0.1:9001
, 因为 9000
连接埠已经被最新的 PHP 8 或者 PHP 7 所占用.
我们还要配置 PHP-FPM 服务 cp sapi/fpm/php-fpm.service /usr/lib/systemd/system/php5-fpm.service
, 并且编辑 vi /usr/lib/systemd/system/php5-fpm.service
: 将 PIDFile=${prefix}/var/run/php-fpm.pid
和 ExecStart=${exec_prefix}/sbin/php-fpm --nodaemonize --fpm-config ${prefix}/etc/php-fpm.conf
中的 ${prefix}
与 ${exec_prefix}
改为你刚刚安装 PHP 5 的路径 (如果按照上面的方法, 那么路径为 /usr/local/php5
).
最后重新载入 systemd : systemctl daemon-reload
, 并且启动 PHP 5 的 PHP-FPM 即可 : systemctl start php5-fpm
. 如果要设置开机启动, 那么执行指令 systemctl enable php5-fpm
.
2. 测试
大家参考《在 CentOS 7 上搭建 Nginx + PHP 7 + MySQL 5.7》中第 3 节最后部分即可, 但是需要注意的是, 由于我们把 PHP 5 的连接埠改为了 9001
, 所以应该修改 Nginx 配置档案中的 fastcgi_pass 127.0.0.1:9000;
为 fastcgi_pass 127.0.0.1:9001;
不要忘了最后还有分号. 输入网址, 就可以看到是否共存正常 :
如果大家需要共存更多版本的 PHP, 那么只需要像本文一样修改安装地址, PHP-FPM 的名称 (例如把 php5-fpm
修改为 php5.3-fpm
), 使用不同的连接埠即可.
自創文章, 原著 : Jonny. 如若閣下需要轉發, 在已經授權的情況下請註明本文出處 :