Tech Racho エンジニアの「?」を「!」に。
  • 開発

PHP5.6のセキュリティサポートが2018年末まで!PHPバージョンアップしよう

BPSの福岡拠点として一緒にお仕事させて頂いてます、株式会社ウイングドアのアリタです。

皆さん、PHP使っていますか?
BPS、ウイングドアではRuby on RailsやiOS/Androidアプリ開発はもちろんPHP案件も取り扱っています。
ただPHP5.6のセキュリティサポートが2018年末で切れてしまうしまったため、やむなくPHP5.6で運用しているサービスはPHPバージョンアップなどの対応を迫られています(PHP5.6のアクティブサポートは2017/01/19に切れています)。

公式サポート状況

バージョン アクティブサポート セキュリティサポート
7.3 2020/12/06 2021/12/06
7.2 2019/11/30 2020/11/30
7.1 2018/12/01 (終了) 2019/12/01
7.0 2017/12/03 (終了) 2018/12/03 (終了)
5.6 2017/01/19 (終了) 2018/12/31 (終了)

参考

※ZendのPHP LTSを使うとPHP5.6が2020年末までサポートになりますが、ここでは割愛します。

※RHEL/CentOSのPHPを利用すると公式のサポート終了後もパッチなどがリリースされますが、ここでは割愛します。

※PHP7.3は2018年12月6日にリリースされています。

06 Dec 2018
The PHP development team announces the immediate availability of PHP 7.3.0.
リリースノートより

今回の環境

まずは今回アップデートしたい環境のPHPのバージョンから。

$ php -v
PHP 5.6.19 (cli) (built: Apr 1 2016 22:29:27)

まずは互換性チェック!

PHP_CodeSnifferを用いてPHPアプリケーションの互換性チェックを行います。
ひとまず確認という形なのでローカル環境(Mac)で確認します。

PHP_CodeSnifferのインストールは
PHP_CodeSnifferを用いたphpアプリケーションの互換性チェック - Qiita
を参考にさせていただきました。

実行結果

$ phpcs -p ./src --standard=PHPCompatibility --runtime-set testVersion 7.3
..............EE..............EEE...E...EE...W..E.WEEE..E.EE 60 / 2438 (2%)
EEEWEWEEEWW...WWW.WE.EWEEEEEWEWWWEEEW.......W....E.EE.E.WEE. 120 / 2438 (5%)
.......W.....E.WWWWWWWWWWWWWWEWWW....W...E...WW.EW.......... 180 / 2438 (7%)
.WW.W.W..E....E..........................E.............W.... 240 / 2438 (10%)
............................................................ 300 / 2438 (12%)
............................................................ 360 / 2438 (15%)
....................................................E....... 420 / 2438 (17%)
............................................................ 480 / 2438 (20%)
..............................................W..EE......... 540 / 2438 (22%)
..WWWW..WWW.WWW.......E..............WE.EE.................. 600 / 2438 (27%)
...WWW...W.........WW............W...W..W.W........W........ 660 / 2438 (22%)
........WWWWWWWWWWWWWWWWWWWWWW.WWWWWWWWWWWWWWWWWWWW........W 720 / 2438 (30%)
.W.........W.....................WW.........W.WWWWWWWWWWWWWW 780 / 2438 (32%)
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW.WE 840 / 2438 (34%)
(中略)
.....W................W.................W..........WW....WW. 2220 / 2438 (91%)
......WW....WW..........W........WWWWWWWWWWWWWWWWWWWWWWWW..W 2280 / 2438 (93%)
W.WWWW....WWW.W.WWWWWWWWWW.......WWWWWWWWWWWWWWWWW.WWWWWWWWW 2340 / 2438 (95%)
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW 2400 / 2438 (98%)
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW 2438 / 2438 (100%)

W(Warning)とE(Error)が大量にありますね・・・。

PHPバージョンアップ対応

まずはphpenvを利用してPHPバージョンを変更して動作確認していきます。
(その他の方法として、Dockerで異なるPHPバージョンの環境を構築しても良いです)

anyenv経由でphpenvをインストール

$ anyenv install phpenv

インストール可能なPHPバージョン確認

$ phpenv install -l
Available versions:
(中略)
7.2.12
7.2.13
7.2snapshot
7.3.0
7.3snapshot
master

PHP7.3インストール

$ phpenv install 7.3.0
[Info]: Loaded extension plugin
[Info]: Loaded apc Plugin.
[Info]: Loaded composer Plugin.
[Info]: Loaded github Plugin.
[Info]: Loaded uprofiler Plugin.
[Info]: Loaded xdebug Plugin.
[Info]: Loaded xhprof Plugin.
[Info]: Loaded zendopcache Plugin.
[Info]: php.ini-production gets used as php.ini
[Info]: Building 7.3.0 into /root/.anyenv/envs/phpenv/versions/7.3.0
[Skipping]: Already downloaded and extracted https://secure.php.net/distributions/php-7.3.0.tar.bz2
[Preparing]: /tmp/php-build/source/7.3.0

-----------------
| BUILD ERROR |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
configure: error: Please reinstall the libzip distribution
-----------------------------------------

The full Log is available at '/tmp/php-build.7.3.0.20181218083905.log'.
[Warn]: Aborting build.

エラーになりました。

エラーを解消してみる

調べた結果、libzipが古い事が原因のようでした。
しかもyumでアップデートできない・・。
更にlibzipをアップデートするためにはCMakeのアップデートが必要・・・。
というわけで、結論からいうと下記の手順で解消しました。
(CMakeとlibzipは記事を書いている時点での最新版を利用しています)

まずは適当な場所に移動

cd /usr/local/src/

CMake更新

wget https://cmake.org/files/v3.13/cmake-3.13.0-Linux-x86_64.tar.gz -O cmake-3.13.0-Linux-x86_64.tar.gz && \
tar zxvf cmake-3.13.0-Linux-x86_64.tar.gz

rm -rf /usr/share/aclocal && \
rm -rf /usr/share/applications && \
rm -rf /usr/share/mime

mv -f cmake-3.13.0-Linux-x86_64/bin/* /usr/bin/ && \
mv -f cmake-3.13.0-Linux-x86_64/share/* /usr/share/

libzip更新

curl -sSLO https://libzip.org/download/libzip-1.5.1.tar.gz &&\
tar zxf libzip-1.5.1.tar.gz

cd libzip-1.5.1/ && mkdir build && cd build && cmake ../ &&\
make > /dev/null && make install

もう一度PHP7.3インストール

$ phpenv install 7.3.0
[Info]: Loaded extension plugin
[Info]: Loaded apc Plugin.
[Info]: Loaded composer Plugin.
[Info]: Loaded github Plugin.
[Info]: Loaded uprofiler Plugin.
[Info]: Loaded xdebug Plugin.
[Info]: Loaded xhprof Plugin.
[Info]: Loaded zendopcache Plugin.
[Info]: php.ini-production gets used as php.ini
[Info]: Building 7.3.0 into /root/.anyenv/envs/phpenv/versions/7.3.0
[Skipping]: Already downloaded and extracted https://secure.php.net/distributions/php-7.3.0.tar.bz2
[Preparing]: /tmp/php-build/source/7.3.0
[Compiling]: /tmp/php-build/source/7.3.0
[Info]: Enabling Opcache...
[Info]: Done
[Info]: The Log File is not empty, but the Build did not fail. Maybe just warnings got logged. You can review the log in /tmp/php-build.7.3.0.20181218094212.log or rebuild with '--verbose' option
[Success]: Built 7.3.0 successfully.

$ phpenv global 7.3.0
7.3.0
$ phpenv rehash
$ php -v
PHP 7.3.0 (cli) (built: Dec 18 2018 09:52:45) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.0-dev, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.3.0, Copyright (c) 1999-2018, by Zend Technologies

アップデート成功!
無事、PHP7.3にアップデートすることが出来ました。

あとはひたすら・・・

辺りを確認して、バージョンアップ対応していきます。
本当はこの辺を書きたかったのですが、ページ(もとい時間)の都合で
記事の紹介までとさせていただきます。

参考

おまけ:Macで発生したエラーの解消

1. Macのphpでdylibエラーが出ました

ローカルの環境を色々いじってしまったせいか、とあるタイミングで下記のエラーが出るようになりました。

$ php -v
dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.62.dylib
Referenced from: /usr/local/opt/php@7.2/bin/php
Reason: image not found

検索したところ、このような記事が

brew reinstall php55

とあるので、php再インストールしてますね・・。

php再インストール

$ brew update && brew upgrade
$ brew reinstall php72

正常に動くようになりました

しかもphp7.3になっている。

$ php -v
PHP 7.3.0 (cli) (built: Dec 7 2018 11:01:10) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.0-dev, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.3.0, Copyright (c) 1999-2018, by Zend Technologies

2. composer --version でエラーが・・・

$ composer --version
PHP Warning: preg_match(): JIT compilation failed: no more memory in phar:///usr/local/bin/composer/vendor/symfony/console/Application.php on line 763
(中略)
Warning: preg_replace(): JIT compilation failed: no more memory in phar:///usr/local/bin/composer/vendor/symfony/console/Formatter/OutputFormatter.phpon line 36

[ErrorException]
preg_match_all(): JIT compilation failed: no more memory

どうもJITでバグがあるようです・・。

php.iniの場所を確認して

$ php -i | grep php.ini
Configuration File (php.ini) Path => /usr/local/etc/php/7.3
Loaded Configuration File => /usr/local/etc/php/7.3/php.ini

php.iniで

;pcre.jit=1
pcre.jit=0

とすればOK。無事エラーも出なくなりました。

$ composer --version
Composer version 1.8.0 2018-12-03 10:31:16

おわりに

年始の (年末の) PHPバージョンアップいかがでしたでしょうか?
今回はPHPのバージョンをPHP5.6からPHP7.3に上げただけですので
実際にはPHPCompatibilityの静的解析で発見された結果や動作確認しておかしな挙動になっている箇所を
対応していく必要があります。まだまだ旅は続きそうですね。
それでは良いPHPライフを!

株式会社ウイングドアでは、Ruby on RailsやPHPを活用したwebサービス、webサイト制作を中心に、
スマホアプリや業務系システムなど様々なシステム開発を承っています。


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。