摘要訊息 : 在 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

这里包含了很多组建, 可以通过自己的需要只挑选自己需要的组件. 看到和如下差不多的图表示配置已经完成 :

Figure 1. configure 完成

接下来使用指令 make 进行编译. 根据你的 CPU 性能, 这一步花费的时间比较长, 耐心等待就可以了. 如果你的 CPU 支援多核心多执行绪, 那么可以使用 make -j8 这样的指令加快速度. 我的伺服器 CPU 最高支援 32 个执行绪, 因此我可以直接使用 make -j32 来最快速地进行编译. 如果结果类似于下面这张图就说明已经编译成功了 :

Figure 2. make 指令成功

这里特别指出, 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 大型的程式, 实际上是没有必要浪费这种时间的, 因为官方早就帮我们测试好了. 安装完成之后你便会看到 :

Figure 3. 安装完成

现在要对一些文件进行配置. 首先创建 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.timezone, 去掉前面的分号并且修改为 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 = nonegroup = none 改为 user = nginxgroup = 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.pidExecStart=${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; 不要忘了最后还有分号. 输入网址, 就可以看到是否共存正常 :

Figure 4. PHP 5 运作正常
Figure 5. 共存的 PHP 7 也运作正常

如果大家需要共存更多版本的 PHP, 那么只需要像本文一样修改安装地址, PHP-FPM 的名称 (例如把 php5-fpm 修改为 php5.3-fpm), 使用不同的连接埠即可.