PHP7.2はPHP7.1より更に速いらしいのでアップデートしてみることにしました。
1.前提条件
yumでPHP7.0にアップデートしています。
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の場合、本体は問題がなくてもテーマやプラグインでエラーが発生する場合がありますので事前検証はしっかりと行いましょう。