如何在 CentOS 7 Linux 中将 PHP 5.6 升级到 7.1

如何将 PHP 5.6 升级到 7.1

准备 PHP 更新

在开始之前,我们可以看到我们当前运行的是 PHP 版本 5.6.30。

[jack@onitroad ~]# php -v
PHP 5.6.30 (cli) (built: Jan 19 2015 22:31:39)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2014, by Zend Technologies

现在让我们了解需要升级的软件包。
我将运行 'yum list installed' 然后为 webtatic 运行 grep 以便我们可以看到从这个存储库安装的所有包。

[jack@onitroad ~]# yum list installed | grep -i webtatic
php56w.x86_64                     5.6.30-1.w7       @webtatic
php56w-cli.x86_64                 5.6.30-1.w7       @webtatic
php56w-common.x86_64              5.6.30-1.w7       @webtatic
php56w-fpm.x86_64                 5.6.30-1.w7       @webtatic
php56w-gd.x86_64                  5.6.30-1.w7       @webtatic
php56w-mbstring.x86_64            5.6.30-1.w7       @webtatic
php56w-mysqlnd.x86_64             5.6.30-1.w7       @webtatic
php56w-opcache.x86_64             5.6.30-1.w7       @webtatic
php56w-pdo.x86_64                 5.6.30-1.w7       @webtatic
php56w-pear.noarch                1:1.10.1-1.w7     @webtatic
php56w-pecl-igbinary.x86_64       2.0.1-1.w7        @webtatic
php56w-pecl-memcache.x86_64       3.0.8-2.w7        @webtatic
php56w-pecl-memcached.x86_64      2.2.0-1.w7        @webtatic
php56w-process.x86_64             5.6.30-1.w7       @webtatic
php56w-xml.x86_64                 5.6.30-1.w7       @webtatic
webtatic-release.noarch           7-3               installed

更改存储库

我正在使用 Webtatic 存储库,但我想更改为 IUS,因此我将首先删除 Webtatic 存储库。
这可以通过删除 webtatic-release 包来完成,该包控制 /etc/yum.repos.d/ 目录中的各种 .repo 文件。

yum remove webtatic-release -y

然后我通过运行以下命令安装 IUS 存储库。

yum install https://centos7.iuscommunity.org/ius-release.rpm

这需要安装 EPEL,我已经安装了。

备份配置

在我们继续删除旧版本的 PHP 之前,请记住,安装新包也意味着新的配置文件。
我建议复制一份 PHP 特定的配置文件,例如 /etc/php.ini 和 /etc/php-fpm.d/www.conf。

删除旧的 PHP 包

虽然我们可以为此使用“yum replace”之类的东西,但我只是使用“yum remove”来删除之前列出的所有 PHP 包。
请记住记下这些,因为我们将在下一步中需要它。

[jack@onitroad ~]# yum remove php56w php56w-cli php56w-common php56w-fpm php56w-gd php56w-mbstring php56w-mysqlnd php56w-opcache php56w-pdo php56w-pear php56w-pecl-igbinary php56w-pecl-memcache php56w-pecl-memcached php56w-process php56w-xml

安装 PHP 7.1

如果不实际安装 PHP 7.1,“将 PHP 5.6 升级到 7.1”教程将是不完整的!

现在有了我们之前删除的 PHP 包列表,我们只需复制它们并稍微编辑一下。
包末尾的“w”表示它是 Webtatic,如果我们使用 Webtatic,请保留“w”。
当我更改为 IUS 时,PHP 包以字母 'u' 结尾。
基于此,我使用 yum 安装这些相同的 PHP 包,除了版本 7.1 而不是 5.6,即 71 而不是 56.
例如,包 php56w 将变为 php71u。

yum install php71u php71u-cli php71u-common php71u-fpm php71u-gd php71u-mbstring php71u-mysqlnd php71u-opcache php71u-pdo php71u-pear php71u-pecl-igbinary php71u-pecl-memcache php71u-pecl-memcached php71u-process php71u-xml php71u-json -y

我们现在可以看到我们正在运行 PHP 7.1.

[jack@onitroad ~]# php -v
PHP 7.1.1 (cli) (built: Jan 18 2015 13:45:30) ( NTS )
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.1.1, Copyright (c) 1999-2015, by Zend Technologies

请注意,默认情况下 php-fpm 不会在系统启动时启动。

[jack@onitroad ~]# systemctl is-enabled php-fpm
disabled

这并不理想,因此我们启用 php-fpm 以便它在系统启动时自动启动。

[jack@onitroad ~]# systemctl enable php-fpm
Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.s                                                                                                                        ervice.

修改配置

现在安装了 PHP 7.1,我浏览了我在上一步中备份的旧 /etc/php.ini 和 /etc/php-fpm.d/www.conf 文件,并将我想要的设置复制到新的文件。
就我个人而言,这主要涉及编辑 /etc/php-fpm.d/www.conf 文件并注释掉以下内容:

;listen = 127.0.0.1:9000

然后我添加了以下条目,或者将它们从现有值修改为这些。
请注意,这些特定于我的 Nginx 配置,配置可能有所不同,这就是为什么输入我们之前保存的相同设置很重要的原因。

user = nginx
group = nginx
listen = /var/run/php-fpm/php-fpm.sock
listen.owner = nginx
listen.group = nginx

故障排除

以下是我们在将 PHP 5.6 升级到 7.1 时可能遇到的一些常见问题的解决方案。

然后我还需要进入 /var/lib/php/ 目录并使用下面的命令将所有内容 chown 到 root:nginx ,因为它已更改为由 php-fpm 所有,这不是我正在使用的。
如果没有这一步会话文件将无法正确写入。

[jack@onitroad ~]# cd /var/run/php/
[jack@onitroad php]# chown -R root:nginx *
[jack@onitroad php]# ls -la
total 40
drwxr-xr-x.  5 root root     44 Mar  5 00:54 .
drwxr-xr-x. 35 root root   4096 Mar  5 00:48 ..
drwxrwx---.  5 root nginx    50 Mar  5 00:48 fpm
drwxrwx---.  5 root nginx    50 Mar  5 00:48 mod_php
drwxrwx---+  2 root nginx 73728 Mar  5 00:48 session

如果没有这一步,我的 Nginx 配置文件中会遇到如下所示的错误日志。
虽然这些错误特定于特定的 WordPress 插件,但它演示了无法写入会话时会发生什么。

2015/03/05 00:49:19 [error] 905#905: *752 FastCGI sent in stderr: "PHP message: PHP Warning:  session_start(): open(/var/lib/php/fpm/session/sess_abcd, O_RDWR) failed: Permission denied (13) in /var/www/website/bwp-recaptcha/includes/class-bwp-recaptcha.php on line 236
2015/03/05 00:49:19 [error] 905#905: *749 FastCGI sent in stderr: "PHP message: PHP Warning:  session_start(): open(/var/lib/php/fpm/session/sess_8cpi4cdjdcq824pmnirdcaujr1, O_RDWR) failed: Permission denied (13) in /var/www/nginx/bwp-recaptcha/includes/class-bwp-recaptcha.php on line 236
PHP message: PHP Warning:  session_start(): Failed to read session data: files (path: /var/lib/php/fpm/session) in /var/www/nginx/bwp-recaptcha/includes/class-bwp-recaptcha.php on line 236" while reading response header from upstream, client: x.x.x.x, server: domain.com, request: "POST /wp-comments-post.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm/php-fpm.sock:", host: "www.domain.com", referrer: "https://www.domain.com/"

我还安装了 'php71u-json' 包,尽管没有安装 PHP 5.6 的等效包,因为以下错误需要它。

FastCGI sent in stderr: "PHP message: PHP Fatal error:  Uncaught Error: Call to undefined function W3TC\json_decode()

我仍然遇到 Jetpack 插件的问题,这可能是 PHP opcache 的错误,正如我在此处发现的那样:https://translate.google.com.au/translate?hl=en&sl=ja&u=https:// jpskenn.homeip.net/2015/01/27/entry_18247/

2015/03/05 01:15:16 [error] 1688#1688: *61 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: x.x.x.x, server: domain.com, request: "POST /xmlrpc.php?for=jetpack&token=... HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm/php-fpm.sock:", host: "www.domain.com", referrer: "https://www.domain.com/xmlrpc.php?for=jetpack&token=..."

当我加载 WordPress 仪表板时,这会出现在我的 Nginx 错误日志文件中,它似乎是从 Jetpack 到 xmlrpc 的 POST。
发生这种情况时,我在 php-fpm 错误日志文件中看到以下内容。

[05-Mar-2015 01:15:16] WARNING: [pool www] child 1670 exited on signal 11 (SIGSEGV) after 163.427669 seconds from start
[05-Mar-2015 01:15:16] NOTICE: [pool www] child 1727 started

虽然不理想,但我已经能够通过编辑 xmlrpc.php 并添加以下条目来解决该问题。

ini_set ('opcache.enable', 0);
日期:2020-07-07 20:54:45 来源:oir作者:oir