PHP 5.4からCLIのphpコマンドにビルトインWebサーバ機能が追加されています。
ツイッターでWebrick(RubyのビルトインというかRuby製のWebサーバ)+素のRailsページはjRubyで44reqs/sec、cRubyで98reqs/secでした、とのツイートを見かけて、PHPのビルトインWebサーバはどの程度かな?と思って手元のマシンで実行してみました。
abコマンドを使ってローカルホストのnull.phpという空のPHPファイルにアクセスしました。
[yohgaki@dev ~]$ ./sapi/cli/php -S localhost:8008 > /dev/null 2>&1 [yohgaki@dev ~]$ ab -n 10000 http://localhost:8008/null.php
結果はこちらです。
Requests per second: 4437.26 [#/sec] (mean)
追記1: 同時接続数130くらいまではスケールするようです。 -c 130 (当時130接続)、-n 100000(10万)で試すと5500reqs/secでした。ただしマルチプロセス・マルチスレッドではないので複数コアがあっても1コアしか使いません。nginxなどと組み合わせると複数コアCPUでは数倍の性能が見込めると思われます。
追記2: 念の為に書いておきます。プロダクションサーバ用に使わないでください。Watch Dog(プロセスを監視して死んだら再起動させるプログラム)がないとPHPのクラッシュバグでDoS攻撃が可能になります。
環境も違うし、Railsの方はRubyコードを実行しているので比較になりませんが、テストコードを動かすには十分過ぎる速度です。実行したのはCore2Quad Q6600という比較的古いCPUのマシンです。
model name : Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40GHz
以下はabコマンドを実行したときのログです。
[yohgaki@dev ~]$ ab -n 10000 http://localhost:8008/null.php This is ApacheBench, Version 2.3 <$Revision: 655654
gt;
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software:
Server Hostname: localhost
Server Port: 8008
Document Path: /null.php
Document Length: 1 bytes
Concurrency Level: 1
Time taken for tests: 2.254 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 1190000 bytes
HTML transferred: 10000 bytes
Requests per second: 4437.26 [#/sec] (mean)
Time per request: 0.225 [ms] (mean)
Time per request: 0.225 [ms] (mean, across all concurrent requests)
Transfer rate: 515.66 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 1
Processing: 0 0 0.1 0 3
Waiting: 0 0 0.0 0 2
Total: 0 0 0.1 0 3
Percentage of the requests served within a certain time (ms)
50% 0
66% 0
75% 0
80% 0
90% 0
95% 0
98% 0
99% 0
100% 3 (longest request)
[yohgaki@dev ~]$