[PHP] 7.1から7.3へアップグレードする

AmazonLinux上でPHP7.1を利用していたのですが、今年の12月でセキュリティアップデートの提供が終了するため、サポート期間が2021年12月までのPHP7.3へアップグレードしました。

パフォーマンスも20%程度アップするみたいですね。こちらも目的だったりもしますw qiita.com

PHP 7.1から7.3へ移行

現在の環境確認

AmazonLinuxの1系を使ってます。

$ cat /etc/os-release 
NAME="Amazon Linux AMI"
VERSION="2018.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2018.03"
PRETTY_NAME="Amazon Linux AMI 2018.03"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2018.03:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"

v7.1.27が入っていますね。

$ php -v
PHP 7.1.27 (cli) (built: Mar  8 2019 18:22:16) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

現在インストールされているパッケージは以下の通り。利用してない物があればこの機会に棚卸しするのが良いでしょう。

$ yum list installed | grep php
php71.x86_64                         7.1.27-1.37.amzn1             @amzn-updates
php71-bcmath.x86_64                  7.1.27-1.37.amzn1             @amzn-updates
php71-cli.x86_64                     7.1.27-1.37.amzn1             @amzn-updates
php71-common.x86_64                  7.1.27-1.37.amzn1             @amzn-updates
php71-devel.x86_64                   7.1.27-1.37.amzn1             @amzn-updates
php71-gd.x86_64                      7.1.27-1.37.amzn1             @amzn-updates
php71-json.x86_64                    7.1.27-1.37.amzn1             @amzn-updates
php71-mbstring.x86_64                7.1.27-1.37.amzn1             @amzn-updates
php71-mysqlnd.x86_64                 7.1.27-1.37.amzn1             @amzn-updates
php71-pdo.x86_64                     7.1.27-1.37.amzn1             @amzn-updates
php71-pecl-igbinary.x86_64           1.2.2-0.1.20151217git2b7c703.6.amzn1
php71-pecl-memcache.x86_64           3.0.9-0.4.20160311git4991c2f.9.amzn1
php71-pecl-memcached.x86_64          3.0.0-0.1.20160217git6ace07d.3.amzn1
php71-process.x86_64                 7.1.27-1.37.amzn1             @amzn-updates
php71-xml.x86_64                     7.1.27-1.37.amzn1             @amzn-updates

事前準備

AWS EC2やLightsailであればインスタンスのスナップショットを取っておきます。 その後、PHPをWebサーバ上で動かしている場合はこのタイミングで停止します。バッチサーバなどコマンドラインだけで使っている場合は次の工程へ。

$ sudo service httpd stop
[sudo] password for katsube: 
Stopping httpd:                                            [  OK  ]

cronで何かPHPのスクリプトを動かしている場合はそちらも停止しておきます。

移行作業

流れとしては消して、再度入れるだけです。今回はyumで管理していたのでコマンド一発です。

まずはyum eraseで関連するパッケージをすべて削除

$ sudo yum erase php71*

その後、必要なパッケージをインストールします。

$ sudo yum install php73 php73-bcmath php73-cli php73-common php73-devel php73-gd php73-json php73-mbstring php73-mysqlnd php73-pdo php73-xml php73-process php73-opcache

今回はv7.3.2が入りました。

$ php -v
PHP 7.3.2 (cli) (built: Feb 15 2019 18:36:52) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.2, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.2, Copyright (c) 1999-2018, by Zend Technologies

php.iniの編集

/etc/php.iniが最終的に/etc/php-7.3.iniを向くようになるので、この中身を必要に応じて編集します。

$ sudo cp /etc/php-7.3.ini /etc/php-7.3.ini.org
$ sudo vi /etc/php-7.3.ini
date.timezone = Asia/Tokyo
mbstring.language = Japanese
mbstring.internal_encoding = UTF8
memory_limit = 16M
expose_php = Off

そういえば最近はdate.timezoneの指定は必須ではなくなった(警告が出なくなった)んですよね。

また同時に/etc/php-7.3.d/配下のファイルも必要があれば編集します。

$ ls /etc/php-7.3.d/
10-opcache.ini   20-exif.ini      20-mbstring.ini   20-sockets.ini    20-xmlwriter.ini   30-xmlreader.ini
20-bcmath.ini    20-fileinfo.ini  20-mysqlnd.ini    20-sqlite3.ini    20-xsl.ini         opcache-default.blacklist
20-bz2.ini       20-ftp.ini       20-pdo.ini        20-sysvmsg.ini    20-zip.ini         php.ini
20-calendar.ini  20-gd.ini        20-phar.ini       20-sysvsem.ini    30-mysqli.ini
20-ctype.ini     20-gettext.ini   20-posix.ini      20-sysvshm.ini    30-pdo_mysql.ini
20-curl.ini      20-iconv.ini     20-shmop.ini      20-tokenizer.ini  30-pdo_sqlite.ini
20-dom.ini       20-json.ini      20-simplexml.ini  20-xml.ini        30-wddx.ini

再開と確認作業

では再開していきます。止めていたApacheを起動するだけ。

$ sudo service httpd start
Starting httpd:                                            [  OK  ]

念の為、以下のようなPHPのファイルをドキュメントルート下などに配置しブラウザからのぞいてみます。

<?php
phpinfo();

Apacheのモジュールも切り替わっていることが確認できました。このファイルはシステム内部の情報が見放題になってしまうので、確認したらすぐに消すかドキュメントルート外に移動しておきます。

その他

言語仕様の変更点

ひとまず下位互換性が切られたところを中心に見ておくのが良いかと思います。

7.1 ⇛ 7.2 www.php.net

7.2 ⇛ 7.3 www.php.net ※こちらは日本語訳がまだみたいですね。

PECLがいない

執筆時点で、AmazonLinuxのyumリポジトリにはPHP7.3用のPECL関連のパッケージが一切いません。もし利用したい場合はPHP7.2をインストールするか、REMIなどのyumリポジトリを追加する必要があります。

$ yum search php73
php73.x86_64 : PHP scripting language for creating dynamic web sites
php73-bcmath.x86_64 : A module for PHP applications for using the bcmath library
php73-cli.x86_64 : Command-line interface for PHP
php73-common.x86_64 : Common files for PHP
php73-dba.x86_64 : A database abstraction layer module for PHP applications
php73-dbg.x86_64 : The interactive PHP debugger
php73-devel.x86_64 : Files needed for building PHP extensions
php73-embedded.x86_64 : PHP library for embedding in applications
php73-enchant.x86_64 : Enchant spelling extension for PHP applications
php73-fpm.x86_64 : PHP FastCGI Process Manager
php73-gd.x86_64 : A module for PHP applications for using the gd graphics library
php73-gmp.x86_64 : A module for PHP applications for using the GNU MP library
php73-imap.x86_64 : A module for PHP applications that use IMAP
php73-intl.x86_64 : Internationalization extension for PHP applications
php73-json.x86_64 : JavaScript Object Notation extension for PHP
php73-ldap.x86_64 : A module for PHP applications that use LDAP
php73-mbstring.x86_64 : A module for PHP applications which need multi-byte string handling
php73-mysqlnd.x86_64 : A module for PHP applications that use MySQL databases
php73-odbc.x86_64 : A module for PHP applications that use ODBC databases
php73-opcache.x86_64 : The Zend OPcache
php73-pdo.x86_64 : A database access abstraction module for PHP applications
php73-pdo-dblib.x86_64 : PDO driver Microsoft SQL Server and Sybase databases
php73-pgsql.x86_64 : A PostgreSQL database module for PHP
php73-process.x86_64 : Modules for PHP script using system process interfaces
php73-pspell.x86_64 : A module for PHP applications for using pspell interfaces
php73-recode.x86_64 : A module for PHP applications for using the recode library
php73-snmp.x86_64 : A module for PHP applications that query SNMP-managed devices
php73-soap.x86_64 : A module for PHP applications that use the SOAP protocol
php73-tidy.x86_64 : Standard PHP module provides tidy library support
php73-xml.x86_64 : A module for PHP applications which use XML
php73-xmlrpc.x86_64 : A module for PHP applications which use the XML-RPC protocol

7.2にはいるんですよね。

$ yum search php72 | grep pecl
php72-pecl-apcu.x86_64 : APC User Cache
php72-pecl-apcu-devel.x86_64 : APCu developer files (header)
php72-pecl-igbinary.x86_64 : Replacement for the standard PHP serializer
php72-pecl-igbinary-devel.x86_64 : Igbinary developer files (header)
php72-pecl-imagick.x86_64 : Extension to create and modify images using
php72-pecl-imagick-devel.x86_64 : imagick extension developer files (header)
php72-pecl-mcrypt.x86_64 : Bindings for the libmcrypt library
php72-pecl-memcache.x86_64 : Extension to work with the Memcached caching daemon
php72-pecl-memcached.x86_64 : Extension to work with the Memcached caching
php72-pecl-oauth.x86_64 : PHP OAuth consumer extension
php72-pecl-redis.x86_64 : Extension for communicating with the Redis key-value
php72-pecl-ssh2.x86_64 : Bindings for the libssh2 library
php72-pecl-uuid.x86_64 : Universally Unique Identifier extension for PHP
php72-pecl-xdebug.x86_64 : Provides functions for function traces and profiling
Papo(パポ) マンモス PVC PA55017
パポ(papo)
売り上げランキング: 60,134