CentOS 7 中安装 PHP 7.3

CentOS 稳定的同时也有短板,官方没有更新某些组件的较新版本。目前 CentOS 7 中的 PHP 还是 5.4 版本,早已过了支持期。本来想坚持用到 CentOS 8 发布。可是 CentOS 8 似乎还遥遥无期,而 PHP 5.4 已经先被 WordPress 的插件嫌弃又被 WordPress 嫌弃了。那就更新吧。然而更新过程并不顺利,觉得还是有必要记录一下。

因为以前用过 remi 的安装源,这次决定还是继续用它。看 remi 上的向导似乎很容易。但还是不敢掉以轻心,觉得还是留一手,免得一时半会儿弄不好的话会导致服务器不在线的时间过长。

备份 VPS 磁盘

之前就一直用 Linode VPS 中的磁盘复制来作为临时的备份。因为之前倒腾数据中心的时候将磁盘尺寸调整到尽量小了,后来 Linode 涨磁盘容量的时候我也没怎么用,完全够用来将当前磁盘复制一份。

不过复制磁盘的功能在新版的云管理器中找不到了。新版 Linode Manager 中只有个「磁盘镜像化 Imagize」(新版 Linode Manager 中,Linodes -> Settings -> Advanced Configurations -> Disks),可是有 2GB 的大小限制。

打开旧版的 Linode Manager 发现磁盘复制功能还在。编辑正在使用的磁盘 CentOS 7,「Duplicate Disk」 (而不是 Create Image,否则有 2GB 大小限制)。更改克隆的新磁盘的标签 Copy of CentOS 7 为 CtOS7_PHP54,作为备份。不过这样虽然省钱,但是在操作的这段时间里的服务器更改,包括网站留言之类的,就不会在还原的时候被保留了。于是我就选了个访问量特别小的周末的半夜来进行这些操作。

有了备份之后就可以大胆玩了,玩坏了还可以修改 Linode VPS 配置将磁盘替换成复制的磁盘来启动,就可以恢复到折腾前的状态了。

升级到 PHP 7.3.3

继续在现用磁盘上折腾,都不需要重启服务器。

按照 Remi 上的指示操作。选择目标 PHP 版本为 7.3.3 并选择 Default/Single version 方式安装。

安装 EPEL 源。这个其实之前已经安装过了。

# yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

安装 remi 源。这个虽然之前用过,可是后来重装系统就没有再用了。

# yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm

安装 YUM 工具。

# yum install yum-utils

现在就可以执行升级从 Remi 源来更新先有软件了。主要是 PHP,但是 phpMyAdmin 我也用了,需要相应的升级到 Remi 源里面的新版本。所以除了启用 remi-php73 源之外还需要启用 remi 主源。

# yum-config-manager --enable remi-php73
# yum-config-manager --enable remi

因为没有使用 priorities 插件了,所以直接执行升级。

# yum update

然而并不能顺利更新,因为有些依赖性问题。

分析并解决更新问题

最大的问题似乎是一些软件包,如 NetworkManager、ipset 之类的因为有低版本不能自动清除而阻碍了安装。yum update 的结尾有提示,

** Found 32 pre-existing rpmdb problem(s), 'yum check' output follows:」。
1:NetworkManager-1.10.2-16.el7_5.x86_64 has missing requires of NetworkManager-libnm(x86-64) = ('1', '1.10.2', '16.el7_5')

1:NetworkManager-1.12.0-8.el7_6.x86_64 is a duplicate with 1:NetworkManager-1.10.2-16.el7_5.x86_64
audit-2.8.1-3.el7_5.1.x86_64 has missing requires of audit-libs(x86-64) = ('0', '2.8.1', '3.el7_5.1')
audit-2.8.4-4.el7.x86_64 is a duplicate with audit-2.8.1-3.el7_5.1.x86_64
……

其实这些软件包都是重复的,它们的高版本已经安装过了。可以通过下面的指令查询,

# package-cleanup --dupes

清除上面的低版本软件包之后居然又发现了一个新的,

[root@CnZhx cnzhx] # package-cleanup --dupes
Loaded plugins: fastestmirror
php-fpm-5.4.16-46.el7.x86_64
php-fpm-5.4.16-45.el7.x86_64

然而似乎还是不行。不管是 yum update 还是 yum upgrade 都会遇到问题。如果使用 --skip-broken 的话,php73 相关的软件包又不会被更新。

于是决定尝试先删除 php 相关的软件包然后重新安装它们。

# yum remove php php-common php-fpm phpmyadmin

根据依赖关系删除的包总共有 22 个。

然后重新安装,

# yum install php php-common php-fpm php-mysqlnd php-opcache php-cli php-gd php-mbstring php-pecl-mcrypt php-php-gettext php-process php-tidy php-xml

完成后重启 httpd 和 php-fpm 服务,

# systemctl restart httpd php-fpm

之后发现似乎可以用了。

安装过程中发现有些包改名字了,比如,php-mysql ==》 php-mysqlnd,php-pecl-zendopcache ==》 php-opcache。

这次终于能够顺利完成了。而且 OpCache 已经成为 PHP 的一部分而不再是单独的 Zend Opcache 插件了。

然后单独安装 phpMyAdmin,因为上面尝试的时候只有它失败了,因为没有 php-zip。再次根据安装结果信息尝试安装可提供 php-zip 的 php-pecl-zip,

# yum install php-pecl-zip

然后就可以安装 phpMyAdmin 了,

# yum install phpmyadmin

安装完成后需要恢复原来的 phpMyAdmin 配置,

  • /etc/phpMyAdmin/config.inc.php.rpmsave 里面有原来的配置,可以直接替换到新产生的 config.inc.php 中,
    # mv /etc/phpMyAdmin/config.inc.php /etc/phpMyAdmin/config.inc.php.rpmnew
    # mv /etc/phpMyAdmin/config.inc.php.rpmsave /etc/phpMyAdmin/config.inc.php
  • phpMyAdmin 的配置文件 /etc/httpd/conf.d/phpMyAdmin.conf.rpmsave
    mv /etc/httpd/conf.d/phpMyAdmin.conf.rpmsave /etc/httpd/conf.d/phpMyAdmin.conf

不需要额外配置即可使用。

其它问题的解决

虽然基本上服务器已经可以正常使用 php73 来工作了,还是有些其它的问题,也就是升级过程中的配置文件变化和网站程序中会在 PHP 7.3 中报错的旧代码。当然也可能是我更新过程中用了 yum upgrade

发现的问题有:

  • php.ini 需要重新优化
  • cnzhx.net 无法正常打开(500)错误,但是其它站点没问题。后来发现是因为安装新 php-fpm 的时候原来的 /etc/php-fpm.d/www.conf 文件被替换为默认的了。修改了其中的 user 和 group 之后就正常了。当然同时也检查了其它相关配置参数。似乎直接用原来的替换掉也没问题的。
  • cnzhx.net 中有些自定义的 PHP 函数有问题,修正之后才完全正常。这些错误可以从该站点的访问日志中查看到。只能说是 php 7 对于语法问题的容忍度更低了。
  • SimpleMachinesForum 因为有 create_function 而出现大量的警告,包括论坛管理单元中的日志和服务器日志中都有。真是非常大量。管理单元中的日志可以简单修改源代码来过滤掉,但是服务器日志中的就没办法了。虽然有个 mod 可以解决 SMF 中出现的 create_function 提示,但是安装的时候发现检测过程有错误,就不敢安装了。这个 mod 也是通过修改源代码来将 create_function 替换成匿名函数(参考这里)。暂时先这样吧。

虽然都不是什么大事儿,可是还是折腾了好久。现在看来似乎已经没什么问题了。

©

本文发表于水景一页。永久链接:<http://cnzhx.net/blog/upgrade-to-php-733-in-centos-7/>。转载请保留此信息及相应链接。

5 条关于 “CentOS 7 中安装 PHP 7.3” 的评论

  1. 不会吧楼主 我也是因为wp 提示php 版本太低无法升级 才想起来说升级下,看你的博文 我都不敢尝试了。

    • 如果你没有多少“奇怪的”配置,估计就跟我的差不多了。

      • 我按照你说的方法 升级后 网站打不开了。出现默认的123页面,没有时间进一步排查,我决定回滚磁盘。

  2. 引用通告: CentOS 8 已经发布 | 水景一页

时间过去太久,评论已关闭。
如果您有话要说,请到讨论区留言并给出此文章链接。
谢谢您的理解 :-)