エンジニア

Nginx + Ubuntu14.04でPHP7を動かす

投稿日:2015年6月10日 更新日:

はじめに

こんにちは、山内です。
タイムラインによれば、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環境、ぜひお試しください。

参考

採用情報

ワンダープラネットでは、一緒に働く仲間を幅広い職種で募集しております。

-エンジニア
-

© WonderPlanet Inc.