dropooiの日記

Linux/クラウド/スマホ/IoT関連の情報集め

PHP7検証

PHP5.6.14とPHP7.0.0RC4 (10/22時点最新)の性能比較メモ

環境:CentOS7
IDCFクラウド highcpu.M4 cpu x 2 memory 4GB

 

試したい事

  1. PHP5とPHP7の単純な性能比較
  2. 各種Webサーバ Apache(mod_php)、nginx、h2o上でのPHP5とPHP7比較
  3. 上の性能が良い組み合わせ上でフレームワーク(silex)での簡単な比較

 

 準備

MySQLサーバは面倒なのでIDCFクラウドRDBで用意

mysqlクライアントだけyumで入れておく
Apache2.4、Nginxもyumでok

 

H2O
$ git clone git@github.com:h2o/h2o.git
$ cd h2o
$ git submodule update --init --recursive
$ cmake .
#cmakeが古い場合は最新版にする

$ make install

libuvが古いと言われたので
$ wget http://dist.libuv.org/dist/v1.7.5/libuv-v1.7.5.tar.gz
$ sh autogen.sh
$ ./configure
$ make
$ make install
もう一度
$ cd h2o
$make install
ok
適当な場所にH2Oの設定ファイルを記述します。
$ sudo mkdir /usr/local/h2o
$ sudo cp ~/h2o/examples/h2o/h2o.conf /usr/local/h2o/
$ emacs /usr/local/h2o # virtualhostとphp-fpmの設定

 

phpenv+php-buildでphp5と7をインストール


$ git clone https://github.com/CHH/phpenv.git
$ cd phpenv/bin/
$ sh phpenv-install.sh

 

$ cat << EOS > ~/.bashrc

export PATH="~/.phpenv/bin:$PATH"
eval "\$(phpenv init -)"

EOS

$ source ~/.bashrc

 

$ git clone https://github.com/CHH/php-build.git

$ cd php-build/
$ sh install.sh

 

 $ php-build --definitions

5.6.11
5.6.12
5.6.13
5.6.14
5.6snapshot
7.0.0alpha1
7.0.0alpha2
7.0.0beta1
7.0.0beta2
7.0.0beta3
7.0.0RC1
7.0.0RC2
7.0.0RC3
7.0.0RC4
7.0snapshot
master

 

最新っぽいRC4を入れたい

その前に、apxsを有効にしてlibphp.soを生成するように指定

$ emacs /usr/local/share/php-build/definitions/7.0.0RC4
configure_option "--with-apxs2" "/usr/bin/apxs"を一番上に記述

 

$ php-build 7.0.0RC4 ~/.phpenv/versions/7.0.0RC4

エラーが出るので必要なパッケージをインストール

$ yum install libxml2-devel bison bison-devel openssl-devel curl-devel libjpeg-devel libpng-devel libmcrypt-devel readline-devel libtidy-devel libxslt-devel

 

もう一度
$ sudo php-build 7.0.0RC4 ~/.phpenv/versions/7.0.0RC4

$ phpenv versions
* system (set by /root/.phpenv/version)
7.0.0RC4

~/.phpenv/versions/7.0.0RC4/bin/php --version
PHP 7.0.0RC4 (cli) (built: Oct 6 2015 02:11:41)
OK!

5.6.14も同様にインストールしておく

 

phpバージョンの切り替えテスト

$ phpenv versions
system
5.6.14
* 7.0.0RC4 (set by /root/.phpenv/version)

$ php -v

PHP 7.0.0RC4 (cli) (built: Oct 6 2015 14:25:27)

$ which php

~/.phpenv/shims/php

 

ok

 

php.iniは

~/.phpenv/versions/{version}/php.ini
php-fpm.confは

~/.phpenv/versions/{version}/etc/php-fpm.conf

 

それぞれ動くように設定しておく。

phpenvで入れるとpeclコマンドがない。

pecl-buildを入れてみる

git clone https://github.com/berenddeboer/pecl-build.git ~/.phpenv/plugins/pecl-build

使い方
% phpenv pecl <package_name>
% phpenv pecl <package_name> -j <php version>
% phpenv pecl <package_name> -a # build all php version by phpenv have.
% phpenv pecl <package_name>-<package_version>

memcachedを入れる
sudo yum install libmemcached libmemcached-devel
phpenv pecl memcached -a

php7には対応していない。。(php5はphpenv peclでok)

php7ブランチがあったのでphp7はphpizeで入れる
git clone -b php7 git@github.com:php-memcached-dev/php-memcached.git
cd php-memcached/

phpize
./configure
make && make install

 

 

Apache(mod_php)

sudo emacs /etc/httpd/conf.d/php.conf

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

DNS、vhosts設定して

sudo systemctl start httpd

http://example.com/

ok

 

 

パフォーマンステスト

== (test.php)
$time_start = microtime(true);
$loop = 10000000;
for($i=0;$i<$loop;$i++) {
$a = rand()/5;
$b++;
}
$timelimit = microtime(true) - $time_start;
echo $timelimit . " seconds" . PHP_EOL;
==

 

単純な計算をコマンドで実行

PHP 5.6.14

$ php test.php
7.0333759784698 seconds

$ phpenv global 7.0.0RC4
php -v
PHP 7.0.0RC4 (cli) (built: Oct 6 2015 14:25:27)


$ php test.php
0.93678998947144 seconds

 

php7が7倍高速!

 

apache + mod_php

さっきのを1000ループに減らしたもので
php5
ab -c 100 -n 10000 http://example.com/test.php
Requests per second: 1450.86 [#/sec] (mean)
Time per request: 68.925 [ms] (mean)

php7
ab -c 100 -n 10000 http://example.com/test.php
Requests per second: 3687.95 [#/sec] (mean)
Time per request: 27.115 [ms] (mean)

 

echoするだけのプログラム
php5
ab -c 100 -n 10000 http://example.com/
Requests per second: 2949.06 [#/sec] (mean)
Time per request: 33.909 [ms] (mean)

php7
ab -c 100 -n 10000 http://example.com/
Requests per second: 4232.79 [#/sec] (mean)
Time per request: 23.625 [ms] (mean)


phpinfo()
php5
ab -c 100 -n 10000 http://example.com/big.php
Requests per second: 737.53 [#/sec] (mean)
Time per request: 135.588 [ms] (mean)

php7
ab -c 100 -n 10000 http://example.com/big.php
Requests per second: 913.32 [#/sec] (mean)
Time per request: 109.491 [ms] (mean)

 

100万ループテスト
php5
ab -c 10 -n 100 http://example.com/test.php
Requests per second: 2.97 [#/sec] (mean)
Time per request: 3367.520 [ms] (mean)
一応動く

php7
ab -c 10 -n 100 http://example.com/test.php
Requests per second: 34.15 [#/sec] (mean)
Time per request: 292.820 [ms] (mean)


1000万ループテスト
php5
ab -c 10 -n 100 http://example.com/test.php
Benchmarking example.com (be patient)...apr_poll: The timeout specified has expired (70007)
ダメ

php7
ab -c 10 -n 100 http://example.com/test.php
Requests per second: 3.50 [#/sec] (mean)
Time per request: 2858.561 [ms] (mean)

 

Apache上ではphp7が2倍以上高速

 

■h2o + php-fpm

1000ループテスト
php5
ab -c 100 -n 10000 http://example.com/test.php
Requests per second: 1851.19 [#/sec] (mean)
Time per request: 54.019 [ms] (mean)

php7
ab -c 100 -n 10000 http://example.com/test.php
Requests per second: 6500.18 [#/sec] (mean)
Time per request: 15.384 [ms] (mean)

 

echoするだけのプログラム
php5
ab -c 100 -n 10000 http://example.com/
Requests per second: 5006.01 [#/sec] (mean)
Time per request: 19.976 [ms] (mean)
同時150くらいにするとエラーが出始める

php7
ab -c 100 -n 10000 http://example.com/
Requests per second: 7890.59 [#/sec] (mean)
Time per request: 12.673 [ms] (mean)

ab -c 150 -n 10000 http://example.com/
Requests per second: 9101.12 [#/sec] (mean)
Time per request: 16.481 [ms] (mean)

ab -c 160 -n 10000 http://example.com/
Requests per second: 9887.56 [#/sec] (mean)
Time per request: 16.182 [ms] (mean)

php7なら同時160でもいける。速い


phpinfo()
php5
ab -c 100 -n 10000 http://example.com/big.php
Requests per second: 894.79 [#/sec] (mean)
Time per request: 111.758 [ms] (mean)

php7

ab -c 100 -n 10000 http://example.com/big.php
Requests per second: 1213.25 [#/sec] (mean)
Time per request: 82.423 [ms] (mean)


100万ループテスト
php5
ab -c 10 -n 100 http://example.com/test.php
Requests per second: 2.59 [#/sec] (mean)
Time per request: 3864.566 [ms] (mean)

php7
ab -c 10 -n 100 http://example.com/test.php
Requests per second: 34.35 [#/sec] (mean)
Time per request: 291.094 [ms] (mean)


1000万ループテスト
php5
ab -c 10 -n 100 http://example.com/test.php
Benchmarking example.com (be patient)...apr_poll: The timeout specified has expired (70007)
ダメ

php7
ab -c 10 -n 100 http://example.com/test.php
Requests per second: 3.54 [#/sec] (mean)
Time per request: 2825.790 [ms] (mean)
一応落ちないで動く

 

h2o(php-fpm)でもphp7の方が1.5倍程高速で且つ、Apache(mod_php)より2倍近く高速

 

■nginx + php-fpm

1000ループテスト
php5
ab -c 100 -n 10000 http://example.com/test.php
Requests per second: 1982.36 [#/sec] (mean)
Time per request: 50.445 [ms] (mean)

php7
ab -c 100 -n 10000 http://example.com/test.php
Requests per second: 6415.60 [#/sec] (mean)
Time per request: 15.587 [ms] (mean)
h2oと同じくらい

 

echoするだけのプログラム
php5
ab -c 100 -n 10000 http://example.com/
Requests per second: 5986.77 [#/sec] (mean)
Time per request: 16.703 [ms] (mean)
ちょっとチューニングしたらh2oより速い
同じく同時150くらいにするとエラーが出始める。php-fpmの所為か?

php7

ab -c 100 -n 10000 http://example.com/
Requests per second: 7491.07 [#/sec] (mean)
Time per request: 13.349 [ms] (mean)
まあまあ

ab -c 150 -n 10000 http://example.com/
Requests per second: 7939.24 [#/sec] (mean)
Time per request: 18.894 [ms] (mean)
H2oより遅い。チューニング次第か?

ab -c 160 -n 10000 http://example.com/
Requests per second: 8172.21 [#/sec] (mean)
Time per request: 19.579 [ms] (mean)

php7なら同時160でもいける。速い


phpinfo()
php5
ab -c 100 -n 10000 http://example.com/big.php
Requests per second: 982.88 [#/sec] (mean)
Time per request: 101.742 [ms] (mean)
h2oより速い

php7
ab -c 100 -n 10000 http://example.com/big.php
Requests per second: 1172.76 [#/sec] (mean)
Time per request: 85.269 [ms] (mean)


100万ループテスト
php5
ab -c 10 -n 100 http://example.com/test.php
Requests per second: 2.91 [#/sec] (mean)
Time per request: 3440.755 [ms] (mean)

php7
ab -c 10 -n 100 http://example.com/test.php
Requests per second: 37.73 [#/sec] (mean)
Time per request: 265.066 [ms] (mean)
h2oと同じくらい


1000万ループテスト
php5
ab -c 10 -n 100 http://example.com/test.php
apr_poll: The timeout specified has expired (70007)
ダメ

php7
ab -c 10 -n 100 http://example.com/test.php
Requests per second: 3.63 [#/sec] (mean)
Time per request: 2754.137 [ms] (mean)
一応落ちないで動く h2oと同じ

 

nginx(php-fpm)でもphp7の方が高速で且つ、Apache(mod_php)より2倍近く高速

性能的にはh2oとの組み合わせと同じ (純粋にfast-cgiの性能が表面化しているだけか)

 

今回はAPI実装に使えるかを確認したいのでh2oではなく、安定したnginxを採用。

まずはsilexで単純なコントローラを作って試してみます。

silexがphp7で動作するかも検証目的になります。

 

nginx+php7+silex

結果、難なくphp7でsilexは動作しました。


datetimeオブジェクトでgetTimestamp()を返すテストコントローラ実行
ab -c 10 -n 100 http://example.com/test/?api_key=8057549061662792094a3df3df9bfe3291550260ccf0cdb708483905777abbba
Requests per second: 619.37 [#/sec] (mean)
Time per request: 16.145 [ms] (mean)

ab -c 30 -n 500 http://example.com/test/?api_key=8057549061662792094a3df3df9bfe3291550260ccf0cdb708483905777abbba
Requests per second: 788.53 [#/sec] (mean)
Time per request: 38.046 [ms] (mean)

ab -c 50 -n 1000 http://example.com/test/?api_key=8057549061662792094a3df3df9bfe3291550260ccf0cdb708483905777abbba
Requests per second: 791.92 [#/sec] (mean)
Time per request: 63.137 [ms] (mean)

DB接続はしていないけど、色々クラスをロードしている割には速い印象

 

nginx+php5+silex

 

systemctl stop php-fpm.service
systemctl start php-fpm5

ab -c 10 -n 100 http://example.com/test/?api_key=8057549061662792094a3df3df9bfe3291550260ccf0cdb708483905777abbba
Requests per second: 170.59 [#/sec] (mean)
Time per request: 58.619 [ms] (mean)

 

ab -c 50 -n 1000 http://example.com/test/?api_key=8057549061662792094a3df3df9bfe3291550260ccf0cdb708483905777abbba
Requests per second: 183.43 [#/sec] (mean)
Time per request: 272.587 [ms] (mean)

 

silex上では、php5よりphp7の方が3倍以上速い

 

まとめ

php5よりphp7の方が2倍以上速い

apache+mod_phpより nginx or h2o + php-fpmの方が速い

HTTP/2の恩恵があまり無さそうなAPIサーバであれば、

nginx + php-fpm (php7) が安定していて高速。

 

とりあえずphp7はphp5よりかなり高速化されている事は分かった。

 

todo

php5.6+Phalcon vs php7+silex

※phalconはphp7未対応なので