Edited at

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

More than 1 year has passed since last update.


待望の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