はじめに
こんにちは、山内です。
タイムラインによれば、PHP7は2015年11月にリリースを予定されていますが、Nightly Build版がZendから公開されているので、6月現在PHP7の環境を構築することができます。今回は、PHP7環境をGCE + Ubuntu14.04上に構築したので紹介します。
PHP7はPHP5系との完全な上位互換性を保ちつつ大幅な性能の向上が図られており、PHP5系で記述されたアプリケーションをそのままPHP7に移行することができます。ただし、Zend Engineのバージョンアップに伴いPHPエクステンション(C/C++)実装については影響を受けることになります。言語仕様はHHVM Hackに影響を受けており、PHP7ではHackのような記述をすることもできますし、従来のPHP5系のような記述をすることもできます。
PHP5.3
function foo() { $x = 'bar'; return function ($y) use ($x) { return $x . $y; }; } $fn = foo(); echo $fn('baz'); // Outputs barbaz
Hack
<?hh // lambda式を返り値とするfoo()の定義 function foo(): (function(string): string) { $x = 'bar'; return $y ==> $x . $y; } function test(): void { $fn = foo(); echo $fn('baz'); // Outputs barbaz }
PHP7
<?php function foo(): callable { $x = 'bar'; return function (string $y) use ($x): string { return $x . $y; }; } $fn = foo(); echo $fn('baz'); // Outputs barbaz
性能面においては、HHVM Hackに比肩する値†1を示しています。
環境構築
・Google Compute Engine g1.small
・Ubuntu 14.04 LTS
まずはもろもろのライブラリをインストール。
# apt-get update && apt-get install -y \ nginx \ libcurl4-openssl-dev \ libmcrypt-dev \ libxml2-dev \ libjpeg62 \ libjpeg-dev \ libfreetype6-dev \ libmysqlclient-dev \ libt1-dev \ libgmp-dev \ libpspell-dev \ libicu-dev \ librecode-dev \ libxpm4
ZendからPHP7を落とします。
# wget http://repos.zend.com/zend-server/early-access/php7/php-7.0-latest-DEB-x86_64.tar.gz # tar -zxPvf php-7.0-latest-DEB-x86_64.tar.gz
PHPのコンフィグを作成します。
# vim /usr/local/php7/etc/php-fpm.conf
[global] pid = /run/php7-fpm.pid error_log = /var/log/php7-fpm.log [www] user = www-data group = www-data listen = 127.0.0.1:9000 pm = dynamic pm.max_children = 12 pm.start_servers = 2 pm.min_spare_servers = 2 pm.max_spare_servers = 6 pm.max_requests = 200
php7-fpmのSystem V系initスクリプト†2を落とします。
# wget -O /etc/init.d/php7-fpm "https://gist.github.com/bjornjohansen/bd1f0a39fd41c7dfeb3a/raw/f0312ec54d1be4a8f6f3e708e46ee34d44ef4657/etc%20inid.d%20php7-fpm" # chmod 755 /etc/init.d/php7-fpm # wget -O /etc/init/php7-fpm "https://gist.github.com/bjornjohansen/9555c056a7e8d1b1947d/raw/15920fa2f447358fdd1c79eecd75a53aaaec76f9/etc%20init%20php7-fpm"
php7-fpmのコンフィグを確認するスクリプトを作成します。
# vim /usr/local/lib/php7-fpm-checkconf
#!/bin/sh set -e errors=$(/usr/local/php7/sbin/php-fpm --fpm-config /usr/local/php7/etc/php-fpm.conf -t 2>&1 | grep "\[ERROR\]" || true); if [ -n "$errors" ]; then echo "Please fix your configuration file…" echo $errors exit 1 fi exit 0
# chmod 755 /usr/local/lib/php7-fpm-checkconf # update-rc.d php7-fpm defaults
Nginxのdefault設定ファイルを変更します。
# vim /etc/nginx/sites-available/default
server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; root /usr/share/nginx/html; index index.php index.html index.htm; # index.php追加 (省略) # コメント解除&修正 location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini # With php5-cgi alone: fastcgi_pass 127.0.0.1:9000; # With php5-fpm: fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
Nginxを再起動後、PHP7-FPMサービスを起動します。
# service nginx restart # service php7-fpm start
service php7-fpm startで起動できない場合はこちらを試してください。
# /usr/local/php7/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php7/etc/php-fpm.conf
おわりに
既存のPHP5系のアプリケーションをそのままの形でパフォーマンスを向上させることができるPHP7環境、ぜひお試しください。