PHP7.0とPHP5.6の比較(WEBアプリケーション編)

By | 2016年2月19日

JWordのO.Yです。
今回はPHP7.0とPHP5.6のパフォーマンス比較をやってみたいと思います。
前の記事ではscalaとpythonのプログラムを書いていましたが元々私はPHPらーなのであのPHPが爆速になった!!・・・と言われるとやはり興味がわきます。

PHPはphp-fpmとして起動してnginxからリクエストをunixドメインソケット経由でphp-fpmに送信し処理するようにします。
アプリケーションはEC-CUBE3.0をインストールしてトップから購入完了(セッション制御の関係上確認ページ以降にはすすめませんが)までの遷移をjmeterのプロキシサーバー機能でテスト計画を自動生成してそのテスト計画を用いてベンチマークします。

EC-CUBE3.0を使用する理由ですが私はEC系の開発をしていた時期があり、その時度々触れる機会のあったEC-CUBEはデフォルト状態で使用しても適度に重く自分で何かアプリケーションを書くよりも有用なパフォーマンステストができるだろうと判断したからです。
またバージョン3.0という最新バージョンを使用したのは新し物好きだからではなく、PHP7.0で動作するEC-CUBEはこのバージョンだけだったことも理由の一つです。
(他のバージョンはPHP7.0で動かそうとすると下位互換性の問題で動きません)

詳細なインフラ条件・ミドルウェアの条件は以下の通りです。

【ベンチマークツール】
jmeter2.12

【サーバー仕様】
Conoha(CPU6core,メモリ8G) x 3

【サーバー用途】
WEBサーバー2台、DBサーバー1台

【サーバー1(PHP7.0がインストールされたWEBサーバー)】
・PHP7.0
・php-fpm(PHP7.0)
・nginx1.0.15
・EC-CUBE3.0

【サーバー2(PHP5.6がインストールされたWEBサーバー)】
・PHP5.6
・php-fpm(PHP5.6)
・nginx1.0.15
・EC-CUBE3.0

【サーバー3(MySQLがインストールされたDBサーバー)】
・MySQL5.6

以下はPHPのコンパイルオプションとphp,php-fpm,nginxの設定です。
またMySQLに関しては設定は変更してません。

(PHP7.0とPHP5.6のコンパイルオプション)

(/etc/php.iniの内容抜粋)

(/etc/php-fpm.confの内容抜粋)

(/etc/nginx/nginx.confの内容)

(/etc/nginx/conf.d/eccube.confの内容)

server_nameにeccube.jword.jpとありますがDNS設定はしてません。
windowsのhostsファイルにipとの紐付けを記述しただけです。

(jmeterの設定)

jmeter-screen-capture
前述しましたようにテスト計画はリバースプロキシ機能により自動生成されたものを使っています。

<<<結果>>>

それではいきなりですがベンチマークの結果を見てみましょう。
まずはPHP7.0の方からです。

jmeter-results-php7

平均レスポンスタイム(リクエストを開始してレスポンスデータの全てを受信するまで):959ms
平均レスポンスタイム偏差:534ms

次はPHP5.6です。
jmeter-results-php56

平均レスポンスタイム(リクエストを開始してレスポンスデータの全てを受信するまで):12258ms
平均レスポンスタイム偏差:23322ms

PHP5.6はあれよあれよという間にレスポンスタイムが増加していき、最後に1分以上かかるようになってきてしまいました。
ですので途中でテストを中断し、その結果が上記となります。
PHP5.6がインストールされているサーバーでtopコマンドで各プロセスの状況を確認してみるとphp-fpmのステータスがD状態となりCPU使用率が高止まりしたままで解放されない状態となっていました。

まとめるとPHP7.0はPHP5.6と比較するとおおよそ3倍はパフォーマンスが良くしかも安定した性能を発揮できてると言えるのではないのでしょうか。
動的ページに対する大規模トラフィックを捌くには正直サーバーを増やすかキャッシュを返すかしか選択肢がなかったPHPですが、今までよりPHP7.0を使えばサーバーコストの削減になるかもしれませんね。
多分まだバグが結構あるとは思いますが、これからが楽しみなPHP7.0の紹介でした。