PHP
PHP7.2

PHP7.2がリリースされたので野良ビルドしてみた

待望のPHP7.2がリリース!

2017/11/30にPHP7.2がリリースされました。
PHP7.2では下記の機能が実装されています。

http://php.net/archive/2017.php#id2017-11-30-1

  • Convert numeric keys in object/array casts
  • Counting of non-countable objects
  • Object typehint
  • HashContext as Object
  • Argon2 in password hash
  • Improve TLS constants to sane values
  • Mcrypt extension removed
  • New sodium extension

今回実装された各項目については、@rana_kualuさんの記事がとてもわかりやすいです。

https://qiita.com/rana_kualu/items/40ebed78742bfdbd1065

私がPHP7.2を待ち望んでいた理由

ずばり、pthreads (マルチスレッド用のPHP拡張機能) (https://github.com/krakjoe/pthreads) がPHP7.1には対応しておらず、PHP7.2からの対応となっていたため、stable版を待っていました。
今回の記事では省きますが、ぶっちゃけconfigureオプション追加してphpizeしてインストールするだけです。

PHP7.2をダウンロードして解凍する

では実際に野良ビルドしていきます。
環境はCentOS 7のx86_64になります。

ワーキングディレクトリを設定する
cd /tmp # /tmpで作業する

PHP7.2をダウンロードして解凍する

$ wget http://jp2.php.net/get/php-7.2.0.tar.gz/from/this/mirror
$ tar zxvf mirror
$ cd php-7.2.0/ # ディレクトリの移動

configureオプションを指定する

今回のconfigureオプションはよく利用される下記を指定します。
必要なものが他にあれば適宜追加してください。

  • apxs (Apache用モジュール) (--with-apxs2)
  • mbstirng (--enable-mbstring)
  • zip (--enable-zip)
  • pdo-mysql (--with-pdo-mysql, --enable-mysqlnd)
  • gettext (--with-gettext)
  • gd (--with-gd, --enable-gd-jis-conv)
  • bcmath (--enable-bcmath)
  • openssl (--with-openssl)
  • intl (--enable-intl)

備考
mcryptは削除されたっぽい?(要出典)(configureオプションから消えていた)
すみません、今回のリリースノートに削除されたと書いてありました😓
必要な場合が多いと思うので、下記に追加する方法を記載しています。

ビルドする

下記のコマンドを走らせます。

configure
$ ./configure --with-apxs2=shared --enable-mbstring --enable-zip --with-pdo-mysql=shared --with-gettext=shared --with-gd=shared --enable-gd-jis-conv --enable-bcmath --with-openssl=shared --with-mhash=shared --enable-intl --enable-maintainer-zts

実行すると下記のように表示されます。

Configuring SAPI modules
checking for Apache 2.0 handler-module support via DSO through APXS... 

Sorry, I cannot run apxs.  Possible reasons follow:

1. Perl is not installed
2. apxs was not found. Try to pass the path using --with-apxs2=/path/to/apxs
3. Apache was not built using --enable-so (the apxs usage page is displayed)

The output of /tmp/php-7.2.0/shared follows:
./configure: line 6285: /tmp/php-7.2.0/shared: No such file or directory
configure: error: Aborting

下記のコマンドで依存関係を解決します。

$ sudo yum install httpd httpd-devel

httpd-develを入れると、/usr/bin/apxsにapxsのバイナリファイルが生成されるのでこれをconfigureの対象にします。

修正すると下記のようになります。

$ ./configure --with-apxs2=/usr/bin/apxs --enable-mbstring --enable-zip --with-pdo-mysql=shared --with-gettext=shared --with-gd=shared --enable-gd-jis-conv --enable-bcmath --with-openssl=shared --with-mhash=shared --enable-intl --enable-intl 

改めて上記をもう一度実行します。
そうすると、下記のようなエラーが表示されます

checking for icu-config... no
checking for location of ICU headers and libraries... not found
configure: error: Unable to detect ICU prefix or no failed. Please verify ICU install prefix and make sure icu-config works.

同様に依存関係を解決するために下記のコマンドを実行します。

$ sudo yum install libicu libicu-devel

また、改めてconfigureを実行します。

checking for xml2-config path... 
configure: error: xml2-config not found. Please check your libxml2 installation.

これも同じく依存関係を解決させるために下記を実行します。

$ sudo yum install libxml2 libxml2-devel

依存関係は解決し、次に下記のようなエラーが表示されます。

If configure fails try --with-webp-dir=<DIR>
If configure fails try --with-jpeg-dir=<DIR>
configure: error: png.h not found.

下記のコマンドで依存関係を追加します。

$ sudo yum install libpng libpng-devel

改めて、configureを実行すると、下記のように成功します。

Generating files
configure: creating ./config.status
creating main/internal_functions.c
creating main/internal_functions_cli.c
+--------------------------------------------------------------------+
|                        *** WARNING ***                             |
|                                                                    |
| You have built PHP for Apache's current non-threaded MPM.          |
| If you change Apache to use a threaded MPM you must reconfigure    |                                 
+--------------------------------------------------------------------+
| License:                                                           |
| This software is subject to the PHP License, available in this     |
| distribution in the file LICENSE.  By continuing this installation |
| process, you are bound by the terms of this license agreement.     |
| If you do not agree with the terms of this license, you must abort |
| the installation process at this point.                            |
+--------------------------------------------------------------------+

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

上記を踏まえて依存関係をまとめ、下記を実行すると一回でconfigureが通ります。

依存関係とともにconfigureする
$ sudo yum install -y httpd httpd-devel libxml2 libxml2-devel libpng libpng-devel libicu libicu-devel
$ ./configure --with-apxs2=/usr/bin/apxs --enable-mbstring --enable-zip --with-pdo-mysql=shared --with-gettext=shared --with-gd=shared --enable-gd-jis-conv --enable-bcmath --with-openssl=shared --with-mhash=shared --enable-intl

makeしてインストールします。

make
$ make && sudo make install

Screen Shot 2017-12-01 at 23.57.53.png

わーきれいー(棒)

make && make installが成功すると下記のように表示されます。

[activating module `php7' in /etc/httpd/conf/httpd.conf]
Installing shared extensions:     /usr/local/lib/php/extensions/no-debug-zts-20170718/
Installing PHP CLI binary:        /usr/local/bin/
Installing PHP CLI man page:      /usr/local/php/man/man1/
Installing phpdbg binary:         /usr/local/bin/
Installing phpdbg man page:       /usr/local/php/man/man1/
Installing PHP CGI binary:        /usr/local/bin/
Installing PHP CGI man page:      /usr/local/php/man/man1/
Installing build environment:     /usr/local/lib/php/build/
Installing header files:          /usr/local/include/php/
Installing helper programs:       /usr/local/bin/
  program: phpize
  program: php-config
Installing man pages:             /usr/local/php/man/man1/
  page: phpize.1
  page: php-config.1
Installing PEAR environment:      /usr/local/lib/php/
[PEAR] Archive_Tar    - installed: 1.4.3
[PEAR] Console_Getopt - installed: 1.4.1
[PEAR] Structures_Graph- installed: 1.1.1
[PEAR] XML_Util       - installed: 1.4.2
[PEAR] PEAR           - installed: 1.10.5
Wrote PEAR system config file at: /usr/local/etc/pear.conf
You may want to add: /usr/local/lib/php to your php.ini include_path
/tmp/php-7.2.0/build/shtool install -c ext/phar/phar.phar /usr/local/bin
ln -s -f phar.phar /usr/local/bin/phar
Installing PDO headers:           /usr/local/include/php/ext/pdo/

実際にインストールされているか確認します。

$ php -v
PHP 7.2.0 (cli) (built: Dec  1 2017 15:59:54) ( ZTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2017 Zend Technologies

インストールされていることを確認しました。

php.iniを設置する

php.iniをコピーします。
PHPが参照しているphp.iniのディレクトリを確認します。

php.iniの設置ディレクトリを確認する
$ php -i | grep php.ini
Configuration File (php.ini) Path => /usr/local/lib

上記とのことなので、この位置にファイルをコピーします。

php.iniのコピー
$ sudo cp php.ini-production /usr/local/lib/php.ini

上記で完了です。

追加した拡張機能をphp.iniに追加します。

/usr/local/lib/php.ini
$ vi /usr/local/lib/php.ini
extension=pdo_mysql.so
extension=openssl.so
extension=gd.so
zend_extension=opcache.so

インストールされているモジュールを確認します。

$ php -m
[PHP Modules]
bcmath
Core
ctype
date
dom
fileinfo
filter
gd
hash
iconv
intl
json
libxml
mbstring
mysqlnd
openssl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
posix
Reflection
session
SimpleXML
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zip

以上でPHP7.2の導入は完了です。

おまけ

他の拡張機能を入れるために、autoconfを導入しておきます

$ sudo yum install autoconf

おまけ1:mcryptを入れる

ウェブアプリケーションフレームワークのCakePHP3ではmcryptの導入を必須としています。
したがって、これがないとインストールできません。

最新版はopensslにも対応しているので、必須ではないです。

念のため下記にPHP7.2におけるmcryptを導入する手順を下記に示します。

$ wget https://pecl.php.net/get/mcrypt-1.0.1.tgz
$ tar zxvf mcrypt-1.0.1.tgz
$ cd mcrypt-1.0.1
$ phpize
$ sudo yum install epel-release libmcrypt libmcrypt-devel
$ ./configure

成功すると下記のように表示されます。

creating libtool
appending configuration tag "CXX" to libtool
configure: creating ./config.status
config.status: creating config.h

make && make installをします

$ sudo make && sudo make install

php.iniに拡張機能情報を追加します。

php.ini
extension=mcrypt.so

モジュールの一覧を確認すると…

$ php -m
[PHP Modules]
... 省略
mcrypt # 導入されているのが確認できました
... 省略

おまけ2: httpd上で、PHP7.2が導入されているか確認する

/var/www/htmlに下記でファイルを追加します。

$ sudo cp /usr/local/bin/php /usr/bin/php
$ sudo php -r "fwrite(fopen('/var/www/html/index.php', 'w+'), '<?php phpinfo();');"

httpd.confに下記を追加します。

<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

追加後、httpdを再起動してください。

成功すると下記のスクリーンショットのように表示されます。

Screen Shot 2017-12-02 at 1.00.43.png