読者です 読者をやめる 読者になる 読者になる

WonderPlanet DEVELOPER BLOG

ワンダープラネットの開発者ブログです。モバイルゲーム開発情報を発信。

Nginx + Ubuntu14.04でPHP7を動かす

はじめに

こんにちは、山内です。
タイムラインによれば、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を落とします。

†2 Bjorn Johansen氏がGitHub上に公開しているものを使わせていただきます。

# 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環境、ぜひお試しください。

参考