CentOS6のPHP7.0/7.1をPHP7.2にアップデート

PHP7.2はPHP7.1より更に速いらしいのでアップデートしてみることにしました。

1.前提条件

yumでPHP7.0にアップデートしています。

CentOS6にPHP7を導入してWordPressを高速化する
サイトの高速化を色々と検証した結果、まずはPHPのアップデートを行うことにしました。 CentOS6のPHPは5.3なのでPHP...
2.remiレポジトリパッケージをアップデート

PHP7.0→PHP7.1のアップデートはレポジトリファイルの修正だけで成功していましたが、今回も同じ方法を試したところlibargon2の依存関係でアップデート処理が止まってしまいました。

# yum update php
///
--> Finished Dependency Resolution
Error: Package: php-cli-7.2.0-2.el6.remi.x86_64 (remi-php72)
           Requires: libargon2.so.0()(64bit)
Error: Package: php-7.2.0-2.el6.remi.x86_64 (remi-php72)
           Requires: libargon2.so.0()(64bit)
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

1年半以上前に導入したremiレポジトリなので結構変更があるのでしょう。まずは検証用サーバでどのパッケージ/レポジトリで導入できるのか確認してみます。

# yum whatprovides libargon2
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: ftp.yz.yamagata-u.ac.jp
 * extras: ftp.iij.ad.jp
 * remi-php71: repo1.sea.innoscale.net
 * remi-safe: repo1.sea.innoscale.net
 * updates: ftp.iij.ad.jp
libargon2-20161029-1.el6.remi.x86_64 : The password-hashing library
Repo        : remi-safe
Matched from:

libargon2-20161029-2.el6.remi.x86_64 : The password-hashing library
Repo        : remi-safe
Matched from:

libargon2-20161029-2.el6.remi.x86_64 : The password-hashing library
Repo        : installed
Matched from:
Other       : Provides-match: libargon2

remi-safeレポジトリがあればlibargon2が当たるという結果に。本番サーバのremi-safe参照先が古い?小手先で弄って修復不可になっては困るので、正攻法でremiレポジトリをアップデートすることにします。

# yum update http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
Loaded plugins: fastestmirror, security
Setting up Update Process
Repository remi-php71-test-debuginfo is listed more than once in the configuration
remi-release-6.rpm                                       |  11 kB     00:00     
Examining /var/tmp/yum-root-****/remi-release-6.rpm: remi-release-6.9-1.el6.remi.noarch
Marking /var/tmp/yum-root-****/remi-release-6.rpm as an update to remi-release-6.6-2.el6.remi.noarch
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * epel: ftp.riken.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * remi-php72: mirrors.mediatemple.net
 * updates: ftp.tsukuba.wide.ad.jp
Resolving Dependencies
--> Running transaction check
---> Package remi-release.noarch 0:6.6-2.el6.remi will be updated
---> Package remi-release.noarch 0:6.9-1.el6.remi will be an update
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package           Arch        Version               Repository            Size
================================================================================
Updating:
 remi-release      noarch      6.9-1.el6.remi        /remi-release-6       12 k

Transaction Summary
================================================================================
Upgrade       1 Package(s)

Total size: 12 k
Is this ok [y/N]: y
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Updating   : remi-release-6.9-1.el6.remi.noarch                           1/2 
warning: /etc/yum.repos.d/remi-php71.repo created as /etc/yum.repos.d/remi-php71.repo.rpmnew
warning: /etc/yum.repos.d/remi-php72.repo created as /etc/yum.repos.d/remi-php72.repo.rpmnew
warning: /etc/yum.repos.d/remi-safe.repo created as /etc/yum.repos.d/remi-safe.repo.rpmnew
  Cleanup    : remi-release-6.6-2.el6.remi.noarch                           2/2 
  Verifying  : remi-release-6.9-1.el6.remi.noarch                           1/2 
  Verifying  : remi-release-6.6-2.el6.remi.noarch                           2/2 

Updated:
  remi-release.noarch 0:6.9-1.el6.remi                                          

Complete!

repoファイルが既に存在しているためrepo.rpmnewとして保存されてしまいました。repoファイルが変更されないと意味がないのでファイル名を入れ替えます。

# cd /etc/yum.repos.d/
# ll |grep remi-
-rw-r--r--  1 root root  457 Jun 30 21:13 remi-php54.repo
-rw-r--r--  1 root root 1316 Jun 30 21:13 remi-php70.repo
-rw-r--r--  1 root root 1177 Dec  4 21:16 remi-php71.repo
-rw-r--r--  1 root root 1316 Jun 30 21:13 remi-php71.repo.rpmnew
-rw-r--r--  1 root root 1177 Dec  4 21:12 remi-php72.repo
-rw-r--r--  1 root root 1316 Jun 30 21:13 remi-php72.repo.rpmnew
-rw-r--r--  1 root root 2609 Jun 30 21:13 remi.repo
-rw-r--r--  1 root root  449 Mar 20  2016 remi-safe.repo
-rw-r--r--  1 root root  751 Jun 30 21:13 remi-safe.repo.rpmnew

# mv remi-php71.repo remi-php71.repo.old && mv remi-php71.repo.rpmnew remi-php71.repo
# mv remi-php72.repo remi-php72.repo.old && mv remi-php72.repo.rpmnew remi-php72.repo
# mv remi-safe.repo  remi-safe.repo.old && mv remi-safe.repo.rpmnew  remi-safe.repo

# ll |grep remi-
-rw-r--r--  1 root root  457 Jun 30 21:13 remi-php54.repo
-rw-r--r--  1 root root 1316 Jun 30 21:13 remi-php70.repo
-rw-r--r--  1 root root 1316 Jun 30 21:13 remi-php71.repo
-rw-r--r--  1 root root 1177 Dec  4 21:16 remi-php71.repo.old
-rw-r--r--  1 root root 1316 Jun 30 21:13 remi-php72.repo
-rw-r--r--  1 root root 1177 Dec  4 21:12 remi-php72.repo.old
-rw-r--r--  1 root root 2609 Jun 30 21:13 remi.repo
-rw-r--r--  1 root root  751 Jun 30 21:13 remi-safe.repo
-rw-r--r--  1 root root  449 Mar 20  2016 remi-safe.repo.old
3.PHP7.2レポジトリを有効化しyumでアップデート

デフォルトではPHP7.2レポジトリは無効化されているため、設定を変更し有効化します。

# vi /etc/yum.repos.d/remi-php72.repo[remi-php72]
  name=Remi's PHP 7.2 RPM repository for Enterprise Linux 6 - $basearch
  #baseurl=http://rpms.remirepo.net/enterprise/6/php72/$basearch/
  #mirrorlist=https://rpms.remirepo.net/enterprise/6/php72/httpsmirror
  mirrorlist=http://rpms.remirepo.net/enterprise/6/php72/mirror
- enabled=0
+ enabled=1
  gpgcheck=1
  gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi

アップデートの準備が出来たので、いよいよyum updateを実行です。

# yum update php
Dependencies Resolved

================================================================================
 Package              Arch       Version                   Repository      Size
================================================================================
Installing:
 php-pecl-mcrypt      x86_64     1.0.1-4.el6.remi.7.2      remi-php72      26 k
     replacing  php-mcrypt.x86_64 7.1.12-4.el6.remi
Updating:
 php                  x86_64     7.2.0-2.el6.remi          remi-php72     2.9 M
Installing for dependencies:
 libargon2            x86_64     20161029-2.el6.remi       remi-safe       21 k
Updating for dependencies:
 php-cli              x86_64     7.2.0-2.el6.remi          remi-php72     4.3 M
 php-common           x86_64     7.2.0-2.el6.remi          remi-php72     1.0 M
 php-gd               x86_64     7.2.0-2.el6.remi          remi-php72      69 k
 php-json             x86_64     7.2.0-2.el6.remi          remi-php72      56 k
 php-mbstring         x86_64     7.2.0-2.el6.remi          remi-php72     1.0 M
 php-mysqlnd          x86_64     7.2.0-2.el6.remi          remi-php72     205 k
 php-opcache          x86_64     7.2.0-2.el6.remi          remi-php72     259 k
 php-pdo              x86_64     7.2.0-2.el6.remi          remi-php72     108 k
 php-pecl-apcu        x86_64     5.1.8-4.el6.remi.7.2      remi-php72      71 k
 php-pecl-apcu-bc     x86_64     1.0.3-7.el6.remi.7.2      remi-php72      14 k
 php-process          x86_64     7.2.0-2.el6.remi          remi-php72      64 k
 php-tidy             x86_64     7.2.0-2.el6.remi          remi-php72      55 k
 php-xml              x86_64     7.2.0-2.el6.remi          remi-php72     173 k

Transaction Summary
================================================================================
Install       2 Package(s)
Upgrade      14 Package(s)

///

Installed:
  php-pecl-mcrypt.x86_64 0:1.0.1-4.el6.remi.7.2                                 

Dependency Installed:
  libargon2.x86_64 0:20161029-2.el6.remi                                        

Updated:
  php.x86_64 0:7.2.0-2.el6.remi                                                 

Dependency Updated:
  php-cli.x86_64 0:7.2.0-2.el6.remi                                             
  php-common.x86_64 0:7.2.0-2.el6.remi                                          
  php-gd.x86_64 0:7.2.0-2.el6.remi                                              
  php-json.x86_64 0:7.2.0-2.el6.remi                                            
  php-mbstring.x86_64 0:7.2.0-2.el6.remi                                        
  php-mysqlnd.x86_64 0:7.2.0-2.el6.remi                                         
  php-opcache.x86_64 0:7.2.0-2.el6.remi                                         
  php-pdo.x86_64 0:7.2.0-2.el6.remi                                             
  php-pecl-apcu.x86_64 0:5.1.8-4.el6.remi.7.2                                   
  php-pecl-apcu-bc.x86_64 0:1.0.3-7.el6.remi.7.2                                
  php-process.x86_64 0:7.2.0-2.el6.remi                                         
  php-tidy.x86_64 0:7.2.0-2.el6.remi                                            
  php-xml.x86_64 0:7.2.0-2.el6.remi                                             

Replaced:
  php-mcrypt.x86_64 0:7.1.12-4.el6.remi                                         

Complete!

アップデートが完了したので早速cliでバージョンを確認します。

# php -v
PHP 7.2.0 (cli) (built: Nov 28 2017 20:38:49) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.2.0, Copyright (c) 1999-2017, by Zend Technologies

しっかりとPHP7.2になってしますね。apacheが掴んでいるPHPは7.1のままなので、任意のタイミングでhttpdを再起動しPHP7.2に切り替えます。

# service httpd restart
Stopping httpd: [  OK  ]
Starting httpd: [  OK  ]

httpd再起動後、phpinfo()にアクセスしPHP7.2が動作していることを確認します。

4.PHP7.2の効果

検証環境で素のWordPress環境を用意し、PHP7.1/PHP7.2のapachebenchを比較します。

# #PHP7.1
# ab -n 1000 -c 100 http://127.0.0.1/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>

Server Software:        Apache/2.2.15
Server Hostname:        127.0.0.1
Server Port:            80

Document Path:          /
Document Length:        9604 bytes

Concurrency Level:      100
Time taken for tests:   17.107 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      9777000 bytes
HTML transferred:       9604000 bytes
Requests per second:    58.46 [#/sec] (mean)
Time per request:       1710.679 [ms] (mean)
Time per request:       17.107 [ms] (mean, across all concurrent requests)
Transfer rate:          558.13 [Kbytes/sec] received
# #PHP7.2
# ab -n 1000 -c 100 http://127.0.0.1/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>

Server Software:        Apache/2.2.15
Server Hostname:        127.0.0.1
Server Port:            80

Document Path:          /
Document Length:        9604 bytes

Concurrency Level:      100
Time taken for tests:   16.053 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      9776000 bytes
HTML transferred:       9604000 bytes
Requests per second:    62.29 [#/sec] (mean)
Time per request:       1605.321 [ms] (mean)
Time per request:       16.053 [ms] (mean, across all concurrent requests)
Transfer rate:          594.70 [Kbytes/sec] received

Requests per secondを比較するとPHP7.2の方が6パーセントほど高速化しています。単純な比較しかしていませんが、アップデートするだけでこれだけ速くなるのなら結構よさそう。

最後に本番サーバのhttping結果を見てみます。が、VPSサーバはブレが多いので、明らかな効果は出ていないですね・・・

5. 互換性には念のため注意を

今回はアップデートはサクッと終わりましたが、PHP7.2ではPHP8.0に向けていくつもの関数が非推奨(Deprecated)になっています。WordPressの場合、本体は問題がなくてもテーマやプラグインでエラーが発生する場合がありますので事前検証はしっかりと行いましょう。

PHP8に備えてcreate_functionを修正する
PHP7.1からPHP7.2にアップデートしたところDeprecatedが出ました。create_function関数が非推奨にな...