自主的20%るぅる

各々が自主的に好き勝手書くゆるふわ会社ブログ

PHP-5.6.xのEOLも近いので、PHP-7.1.xを試してみた

いつの間にかPHP5.6.xのEOLが……

コの業界において、意識していなければいけないことは多々あります。EOL——End Of Life1)サポート期間は、その中でも特に重要なもののひとつですね。

PHPerな私は、特にPHPのEOLは興味津々なわけです。

2015年末にPHP-7.0.x系、2016年末にPHP-7.1.x系がリリースされたこともあり、PHP-5.6.x系も終わりが見えてきましたね。2)それ以前のバージョンはすでにEOLですね3)ちなみに、ディストリビューションによっては
セキュリティフィックスなどをバックポートして
独自にアップデートを提供してたりもするっぽいです

さて、私の管理下にあるいくつかのサイトは、PHP-5.6.x系を使っています。

セキュリティサポート期間がまだ残っているので、時間的猶予はまだありますが……。「夏休みの宿題」よろしく締め切り間際に慌てるのは……アレですよね(;´Д`)

というわけで、手元のVagrantなCentOS7にPHP-7.1.34)このエントリを書いている時点の最新リリースなのでをインストールしてみようと思います
(`・ω・´)b

インストールしてみるよ〜

さて、サクッと試してみましょう。ここからはVagrantを使ってお試ししてみます。

なお、OSとしてはCentOS7、WebサーバはApache2.4.x系を使用しています。モジュール(mod_php〜)を使ったケースなので、nginxを使いたい人やFastCGIで使いたい人などには役に立たないエントリに仕上がっています。

まずはダウンロード

最初にミラーサイトからTarballをダウンロードし、展開します。このエントリでご紹介している手順の都合で、展開後のディレクトリ名も変更します。5)普通にインストールするなら、不要な手順です

$ wget -O php-7.1.3.tar.bz2  'http://jp2.php.net/get/php-7.1.3.tar.bz2/from/this/mirror'
$ tar xjf ./php-7.1.3.tar.bz2
$ mv ./php-7.1.3 ./php71

基本的には、この後configureしてmakeしてmake installすればインストールされます。

一応、オフィシャルのダウンロードページを載せておきますね。

そしてconfigure

……が、そこそこconfigureのオプションを指定したいってのもあり、バージョンアップの度にそれタイプしたくないってのもありで……。

簡単なbashスクリプトを書きました。

中身的にはただconfigureのオプションがつらつら書いてある6)一応、「./configure –help」のカテゴリ/ブロックごとに分けられているはず……だけです。GitHubのGistにアップしてありますので、embedしておきます。

コイツを何らかの方法でゲットします。7)gitでcloneしてもよし。
ダウンロードしてSFTPかなにかでアップしてもよし。
必要に応じて、configureオプションの調整をお忘れなく。8)指定できるブツの一覧は、「bash ./php71/configure –help」でチェック!そしたら、Tarballと同階層に配置&実行すればOK!

$ bash ./build_php71.sh
(略)

ずらずらとconfigureの出力が流れてきて、うまいこと終われば下記みたいに出力されるはず。

Thank you for using PHP.

config.status: creating php7.spec
config.status: creating main/build-defs.h
config.status: creating scripts/phpize
config.status: creating scripts/man1/phpize.1
config.status: creating scripts/php-config
config.status: creating scripts/man1/php-config.1
config.status: creating sapi/cli/php.1
config.status: creating sapi/cgi/php-cgi.1
config.status: creating ext/phar/phar.1
config.status: creating ext/phar/phar.phar.1
config.status: creating main/php_config.h
config.status: executing default commands
$

参考:エラーになったらどうすればいいの?(´・ω・`)

そうでなくて下記みたいに「error」の文字が見えたら……。たぶん、必要なライブラリとかが不足しています。9)たぶん、開発関係のパッケージ

checking for GD support... yes
checking for the location of libwebp... yes
checking for the location of libjpeg... yes
checking for the location of libpng... yes
checking for the location of libXpm... yes
checking for FreeType 2... yes
checking whether to enable truetype string function in GD... yes
checking whether to enable JIS-mapped Japanese font support in GD... yes
configure: error: webp/decode.h not found.

例えばこの例10)適当に必要なライブラリを消して出したエラーなので、
あくまで例示だとおもってね(はぁと
だと、「webp/decode.h」が見つからないと出ています。

ナニモノかは知りませんが、webpのC/C++言語のヘッダファイルらしきものが見つからないようです。そいつのありかを探しましょう。

とりあえず、「webp」ってのをキーワードにして探してみます。

$ yum search webp
(略)
libwebp.i686 : Library and tools for the WebP graphics format
libwebp.x86_64 : Library and tools for the WebP graphics format
libwebp-devel.i686 : Development files for libwebp, a library for the WebP format
libwebp-devel.x86_64 : Development files for libwebp, a library for the WebP format
libwebp-java.x86_64 : Java bindings for libwebp, a library for the WebP format
libwebp-tools.x86_64 : The WebP command line tools
(略)

それっぽいのが見つかりました。そいつらをインストールしてみましょう。

$ sudo yum install libwebp libwebp-devel libwebp-tools
(略)

もう一度、先のスクリプトを実行すれば……。このエラーは消えるはずです。

違うエラーが出るかもしれませんが、この要領で不足しているブツをインストールしていけばいつかはビルドが成功するはずです。

ビルドしてインストールするよ〜

ここまで終われば、ほとんど作業が終わったも同然。

下記コマンドで、ビルドしちゃいましょう。

$ make
(略)

ちょっと時間がかかるので、お茶でも飲みながらマッタリ待ちます。

正常に終わると、下記のような表示になります。

Generating phar.php
Generating phar.phar
PEAR package PHP_Archive not installed: generated phar will require PHP's phar extension be enabled.
directorytreeiterator.inc
directorygraphiterator.inc
pharcommand.inc
clicommand.inc
invertedregexiterator.inc
phar.inc

Build complete.
Don't forget to run 'make test'.

なお、「Dont’t forget〜」と出てますが、今回は忘れることにします。

続いて、インストール。これは下記のコマンドでOKです。

$ sudo make install
(略)

こうすると、「/usr/local/php71」にPHP-7.1.3が一式インストールされます。

インストールされる場所が気にくわなければ、「build_php71.sh」中の「–prefix」オプションで指定しているパスをお好みのものに書き換えてください。

シンボリックリンクさんに頼る

このままでもいいんですけど、CLIで使いたい時にフルパスで指定する必要があります。なぜなら、「/usr/local/php71」配下にはパスが通っていませんので。

パスを通してもいいですが、今回は「/usr/local/bin」にシンボリックリンクを作ることにします。例によってbashスクリプトっぽい感じでGistにアップしてあります。

Apacheのコンフィグをチェックする。

手元の環境ではApache2.4系を使っています。

ので、Apacheさん経由でPHP-7.1.3が使えるようになっているかチェックしてみます。

使えるようになっていれば、下記のような記述が含まれているはずです。どこにも存在しなければ、「LoadModule〜」がいっぱい書いてあるブロックの一番下あたりに下記を追加しましょう。

LoadModule php7_module        modules/libphp7.so
<IfModule mod_php7.c>
  AddType application/x-httpd-php .php .inc
</IfModule>

ちなみに、ずっとPHP-5.6.xを使っていた環境などでは、下記のような記述が含まれているかもしれません。

LoadModule php5_module        modules/libphp5.so
<IfModule mod_php5.c>
  AddType application/x-httpd-php .php .inc
</IfModule>

これが残っているとsegfaultなどでApacheが落ちて起動しなくなります。11)これに気づかず、1時間くらい頭を悩ませた系似非エンジニアが私ですコメントアウトしておくか、いっそばっさり消してしまいましょう。

php.iniを配置する

PHPの設定ファイルである「php.ini」を配置しましょう。

先の「build_php71.sh」では、「/usr/local/apache2/conf」配下に配置するアレになっています。気に入らなければ、「–with-config-file-path」のアレを変更してください。

ゼロから作るのは大変ですし無意味ですので、ベースとなるコンフィグを元にアレしていきましょう。

Tarballを展開してできたディレクトリ中に、「php.ini-development」と「php.ini-production」の2ファイルが存在します。

前者が開発環境向け、後者が本番環境向けの「ひな形」12)あくまで「ひな形」なので注意ですね。今回は「php.ini-production」をベースにコンフィグを見ていきましょう。

とりあえず、動作検証に使う用……ということで、私は下記のようなコンフィグにしてみました。例によって、Gistにアップしているのをembedしようと思ったのですが、長いのでリンクだけ貼っておきます。

hayakawa/php.ini – GitHubGist

なお、このコンフィグにはxdebugの設定も含まれています。……が、ここまでの手順ではxdebugのインストールなどはやっていないので使えません。

xdebugまわりについては、別なエントリで書こうと思います。長くなるので。

Apacheを(再)起動しよう!

ここまでくれば、あとはApacheを再起動するだけでOK!

$ sudo systemctl restart httpd

ドキュメントルートにテキトーなPHPスクリプトを置いて動作確認します。例えば、下記のようなヤツですね。

<?php
    phpinfo();

こんな感じになっていれば、ちゃんと動いているはず!やったね!

さあ!検証しよう!

環境ができあがったので、既存のPHPスクリプトがちゃんと動くのかを検証しましょう。

……ここからが長い道のりなんだよなぁ……(遠い目

ちなみに、こんな面倒なことしなくてもREMIさんところにパッケージが用意されています。

何も考えず抽出した一覧を載せておきますね〜!

$ yum search php71 --enablerepo=remi
(略)
php71-php-pecl-mysql-xdevapi-devel.x86_64 : php71-php-pecl-mysql-xdevapi developer files (header)
php71-php-pecl-propro-devel.x86_64 : php71-php-pecl-propro developer files (header)
php71-php-pecl-raphf-devel.x86_64 : php71-php-pecl-raphf developer files (header)
php71-php-pecl-xmldiff-devel.x86_64 : php71-php-pecl-xmldiff developer files (header)
php71-php-pecl-yaconf-devel.x86_64 : php71-php-pecl-yaconf developer files (header)
php71-runtime.x86_64 : Package that handles php71 Software Collection.
php71-scldevel.x86_64 : Package shipping development files for php71
php71.x86_64 : Package that installs PHP 7.1
php71-build.x86_64 : Package shipping basic build configuration
php71-php.x86_64 : PHP scripting language for creating dynamic web sites
php71-php-ast.x86_64 : Abstract Syntax Tree
php71-php-bcmath.x86_64 : A module for PHP applications for using the bcmath library
php71-php-channel-horde.noarch : Adds pear.horde.org channel to PEAR
php71-php-cli.x86_64 : Command-line interface for PHP
php71-php-common.x86_64 : Common files for PHP
php71-php-dba.x86_64 : A database abstraction layer module for PHP applications
php71-php-dbg.x86_64 : The interactive PHP debugger
php71-php-devel.x86_64 : Files needed for building PHP extensions
php71-php-embedded.x86_64 : PHP library for embedding in applications
php71-php-enchant.x86_64 : Enchant spelling extension for PHP applications
php71-php-fpm.x86_64 : PHP FastCGI Process Manager
php71-php-gd.x86_64 : A module for PHP applications for using the gd graphics library
php71-php-geos.x86_64 : PHP module for GEOS
php71-php-gmp.x86_64 : A module for PHP applications for using the GNU MP library
php71-php-horde-horde-lz4.x86_64 : Horde LZ4 Compression Extension
php71-php-imap.x86_64 : A module for PHP applications that use IMAP
php71-php-interbase.x86_64 : A module for PHP applications that use Interbase/Firebird databases
php71-php-intl.x86_64 : Internationalization extension for PHP applications
php71-php-json.x86_64 : JavaScript Object Notation extension for PHP
php71-php-ldap.x86_64 : A module for PHP applications that use LDAP
php71-php-libvirt.x86_64 : PHP language binding for Libvirt
php71-php-libvirt-doc.noarch : Document of php-libvirt
php71-php-litespeed.x86_64 : LiteSpeed Web Server PHP support
php71-php-lz4.x86_64 : LZ4 Extension for PHP
php71-php-mbstring.x86_64 : A module for PHP applications which need multi-byte string handling
php71-php-mcrypt.x86_64 : Standard PHP module provides mcrypt library support
php71-php-mysqlnd.x86_64 : A module for PHP applications that use MySQL databases
php71-php-oci8.x86_64 : A module for PHP applications that use OCI8 databases
php71-php-odbc.x86_64 : A module for PHP applications that use ODBC databases
php71-php-opcache.x86_64 : The Zend OPcache
php71-php-pdo.x86_64 : A database access abstraction module for PHP applications
php71-php-pdo-dblib.x86_64 : PDO driver Microsoft SQL Server and Sybase databases
php71-php-pear.noarch : PHP Extension and Application Repository framework
php71-php-pecl-amqp.x86_64 : Communicate with any AMQP compliant server
php71-php-pecl-apcu.x86_64 : APC User Cache
php71-php-pecl-apcu-bc.x86_64 : APCu Backwards Compatibility Module
php71-php-pecl-apcu-devel.x86_64 : APCu developer files (header)
php71-php-pecl-apfd.x86_64 : Always Populate Form Data
php71-php-pecl-apm.x86_64 : Alternative PHP Monitor
php71-php-pecl-bitset.x86_64 : BITSET library
php71-php-pecl-cassandra.x86_64 : DataStax PHP Driver for Apache Cassandra
php71-php-pecl-couchbase2.x86_64 : Couchbase Server PHP extension
php71-php-pecl-crypto.x86_64 : Wrapper for OpenSSL Crypto Library
php71-php-pecl-dbase.x86_64 : dBase database file access functions
php71-php-pecl-dio.x86_64 : Direct I/O functions
php71-php-pecl-druid.x86_64 : A Druid driver for PHP
php71-php-pecl-ds.x86_64 : Data Structures for PHP
php71-php-pecl-eio.x86_64 : Provides interface to the libeio library
php71-php-pecl-env.x86_64 : Load environment variables
php71-php-pecl-ev.x86_64 : Provides interface to libev library
php71-php-pecl-event.x86_64 : Provides interface to libevent library
php71-php-pecl-fann.x86_64 : Wrapper for FANN Library
php71-php-pecl-gearman.x86_64 : PHP wrapper to libgearman
php71-php-pecl-gender.x86_64 : Gender Extension
php71-php-pecl-geoip.x86_64 : Extension to map IP addresses to geographic places
php71-php-pecl-geospatial.x86_64 : PHP Extension to handle common geospatial functions
php71-php-pecl-gmagick.x86_64 : Provides a wrapper to the GraphicsMagick library
php71-php-pecl-gnupg.x86_64 : Wrapper around the gpgme library
php71-php-pecl-hdr-histogram.x86_64 : PHP extension wrapper for the C hdrhistogram API
php71-php-pecl-hprose.x86_64 : Hprose for PHP
php71-php-pecl-hrtime.x86_64 : High resolution timing
php71-php-pecl-http.x86_64 : Extended HTTP support
php71-php-pecl-http-devel.x86_64 : Extended HTTP support developer files (header)
php71-php-pecl-igbinary.x86_64 : Replacement for the standard PHP serializer
php71-php-pecl-igbinary-devel.x86_64 : Igbinary developer files (header)
php71-php-pecl-imagick.x86_64 : Extension to create and modify images using ImageMagick
php71-php-pecl-imagick-devel.x86_64 : imagick extension developer files (header)
php71-php-pecl-inotify.x86_64 : Inotify
php71-php-pecl-json-post.x86_64 : JSON POST handler
php71-php-pecl-krb5.x86_64 : Kerberos authentification extension
php71-php-pecl-krb5-devel.x86_64 : Kerberos extension developer files (header)
php71-php-pecl-libsodium.x86_64 : Wrapper for the Sodium cryptographic library
php71-php-pecl-lua.x86_64 : Embedded lua interpreter
php71-php-pecl-lzf.x86_64 : Extension to handle LZF de/compression
php71-php-pecl-mailparse.x86_64 : PHP PECL package for parsing and working with email messages
php71-php-pecl-memcache.x86_64 : Extension to work with the Memcached caching daemon
php71-php-pecl-memcached.x86_64 : Extension to work with the Memcached caching daemon
php71-php-pecl-memprof.x86_64 : Memory usage profiler
php71-php-pecl-mogilefs.x86_64 : PHP client library to communicate with the MogileFS storage
php71-php-pecl-mongodb.x86_64 : MongoDB driver for PHP
php71-php-pecl-mosquitto.x86_64 : Extension for libmosquitto
php71-php-pecl-msgpack.x86_64 : API for communicating with MessagePack serialization
php71-php-pecl-msgpack-devel.x86_64 : MessagePack developer files (header)
php71-php-pecl-mysql.x86_64 : MySQL database access functions
php71-php-pecl-mysql-xdevapi.x86_64 : MySQL database access functions
php71-php-pecl-oauth.x86_64 : PHP OAuth consumer extension
php71-php-pecl-pcs.x86_64 : PHP Code Service
php71-php-pecl-pcs-devel.x86_64 : PHP Code Service (header)
php71-php-pecl-pdflib.x86_64 : Package for generating PDF files
php71-php-pecl-pq.x86_64 : PostgreSQL client library (libpq) binding
php71-php-pecl-propro.x86_64 : Property proxy
php71-php-pecl-radius.x86_64 : Radius client library
php71-php-pecl-raphf.x86_64 : Resource and persistent handles factory
php71-php-pecl-rdkafka.x86_64 : Kafka client based on librdkafka
php71-php-pecl-redis.x86_64 : Extension for communicating with the Redis key-value store
php71-php-pecl-ref.x86_64 : Soft and Weak references support in PHP
php71-php-pecl-request.x86_64 : Server-side request and response objects
php71-php-pecl-rrd.x86_64 : PHP Bindings for rrdtool
php71-php-pecl-scrypt.x86_64 : Scrypt hashing function
php71-php-pecl-seaslog.x86_64 : A effective,fast,stable log extension for PHP
php71-php-pecl-selinux.x86_64 : SELinux binding for PHP scripting language
php71-php-pecl-solr2.x86_64 : API orientée objet pour Apache Solr
php71-php-pecl-ssdeep.x86_64 : Wrapper for libfuzzy library
php71-php-pecl-ssh2.x86_64 : Bindings for the libssh2 library
php71-php-pecl-stats.x86_64 : Routines for statistical computation
php71-php-pecl-stomp.x86_64 : Stomp client extension
php71-php-pecl-swoole.x86_64 : PHP's asynchronous concurrent distributed networking framework
php71-php-pecl-swoole-serialize.x86_64 : Fast and Small serialize
php71-php-pecl-swoole2.x86_64 : PHP's asynchronous concurrent distributed networking framework
php71-php-pecl-sync.x86_64 : Named and unnamed synchronization objects
php71-php-pecl-taint.x86_64 : XSS code sniffer
php71-php-pecl-tcpwrap.x86_64 : Tcpwrappers binding
php71-php-pecl-termbox.x86_64 : A termbox wrapper for PHP
php71-php-pecl-trace.x86_64 : Trace is a low-overhead tracing tool for PHP
php71-php-pecl-trader.x86_64 : Technical Analysis for traders
php71-php-pecl-translit.x86_64 : Transliterates non-latin character sets to latin
php71-php-pecl-ui.x86_64 : UI API
php71-php-pecl-uopz.x86_64 : User Operations for Zend
php71-php-pecl-uploadprogress.x86_64 : An extension to track progress of a file upload
php71-php-pecl-uuid.x86_64 : Universally Unique Identifier extension for PHP
php71-php-pecl-uv.x86_64 : Libuv wrapper
php71-php-pecl-varnish.x86_64 : Varnish Cache bindings
php71-php-pecl-vips.x86_64 : PHP extension for interfacing with libvips
php71-php-pecl-vld.x86_64 : Dump the internal representation of PHP scripts
php71-php-pecl-weakref.x86_64 : Implementation of weak references
php71-php-pecl-xattr.x86_64 : Extended attributes
php71-php-pecl-xdebug.x86_64 : PECL package for debugging PHP scripts
php71-php-pecl-xdiff.x86_64 : File differences/patches
php71-php-pecl-xmldiff.x86_64 : XML diff and merge
php71-php-pecl-xxtea.x86_64 : XXTEA encryption algorithm extension for PHP
php71-php-pecl-yac.x86_64 : Lockless user data cache
php71-php-pecl-yaconf.x86_64 : Yet Another Configurations Container
php71-php-pecl-yaf.x86_64 : Yet Another Framework
php71-php-pecl-yaml.x86_64 : PHP Bindings for yaml
php71-php-pecl-yar.x86_64 : Light, concurrent RPC framework
php71-php-pecl-yaz.x86_64 : Z39.50/SRU client
php71-php-pecl-zip.x86_64 : Une extension de gestion des ZIP
php71-php-pecl-zmq.x86_64 : ZeroMQ messaging
php71-php-pgsql.x86_64 : A PostgreSQL database module for PHP
php71-php-phalcon3.x86_64 : Phalcon Framework
php71-php-phpiredis.x86_64 : Client extension for Redis
php71-php-pinba.x86_64 : Client extension for Pinba statistics server
php71-php-process.x86_64 : Modules for PHP script using system process interfaces
php71-php-pspell.x86_64 : A module for PHP applications for using pspell interfaces
php71-php-recode.x86_64 : A module for PHP applications for using the recode library
php71-php-smbclient.x86_64 : PHP wrapper for libsmbclient
php71-php-snappy.x86_64 : Snappy Extension for PHP
php71-php-snmp.x86_64 : A module for PHP applications that query SNMP-managed devices
php71-php-soap.x86_64 : A module for PHP applications that use the SOAP protocol
php71-php-sqlsrv.x86_64 : Microsoft Drivers for PHP for SQL Server
php71-php-tarantool.x86_64 : PHP driver for Tarantool/Box
php71-php-tidy.x86_64 : Standard PHP module provides tidy library support
php71-php-twig.noarch : The flexible, fast, and secure template engine for PHP
php71-php-xml.x86_64 : A module for PHP applications which use XML
php71-php-xmlrpc.x86_64 : A module for PHP applications which use the XML-RPC protocol
php71-zephir.noarch : Zephir language for creation of extensions for PHP.
php71-zephir-parser.x86_64 : Zephir parser extension
(略)

注訳はこちら

注訳はこちら
1 サポート期間
2 それ以前のバージョンはすでにEOLですね
3 ちなみに、ディストリビューションによっては
セキュリティフィックスなどをバックポートして
独自にアップデートを提供してたりもするっぽいです
4 このエントリを書いている時点の最新リリースなので
5 普通にインストールするなら、不要な手順です
6 一応、「./configure –help」のカテゴリ/ブロックごとに分けられているはず……
7 gitでcloneしてもよし。
ダウンロードしてSFTPかなにかでアップしてもよし。
8 指定できるブツの一覧は、「bash ./php71/configure –help」でチェック!
9 たぶん、開発関係のパッケージ
10 適当に必要なライブラリを消して出したエラーなので、
あくまで例示だとおもってね(はぁと
11 これに気づかず、1時間くらい頭を悩ませた系似非エンジニアが私です
12 あくまで「ひな形」なので注意
Let’s share this article!

{ 関連記事 }

{ この記事を書いた人 }

Yuta Hayakawa

2016年6月入社。2020年12月より取締役に就任しました。

普段は東京本社で管理職のお仕事したり、広報的役割としてテキスト書いたり動画作ったりするのが最近のお仕事。

自称「社内システムチーム統括」として、社内システムチームの面々を見守りつつ毎日を過ごしています。

プライベート面では、音楽やコンピュータ関連、ゴルハム&ジャンハム関係、ゲーム関係が興味あるポイント。

あと、我が子可愛い。

記事一覧