Phalconは、Cの拡張モジュールとして実装されていて、他のPHPのWeb Frameworkより高速ということで、試してみました。サポートしているPHPのバージョンは、5.3以降です。
インストール
1 2 3 |
$ git clone git://github.com/phalcon/cphalcon.git $ cd cphalcon/build $ sudo ./install |
phpの環境が複数インストールされている場合は、installを次のように編集します。
- phpizeをフルパスで指定。
- 最下行の./configureに–with-php-configオプションを追加して、php-configを指定。
php.iniに以下の行を追加してWebサーバーを再起動します。
1 |
extension=phalcon.so |
phpinfo()にphalconの項目が表示されることを確認してインストールは完了です。
Developer Tools
Phalcon本体にはscaffoldは用意されておらず、ディレクトリ構成は自由に決められます。でもこれは良し悪しで、ディレクトリ構成などに頭を悩ませたくないという方も多いと思います。そういう方のためにDeveloper Toolsというツールがあります。今回はこのツールを使います。
1 2 3 |
$ git clone https://github.com/phalcon/phalcon-devtools.git $ sudo cp phalcon-devtools /usr/local/share $ sudo ln -s /usr/local/bin/phalcon /usr/local/share/phalcon-devtools/phalcon.php |
プロジェクト
Developer Toolsを使ってプロジェクトを作成します。今回はtestという名前のプロジェクトにしました。
1 |
$ phalcon project test |
以下のファイルが生成されますので、publicをDocumentRootにしてWebサーバーを再起動します。
また、app/cacheはテンプレートのキャッシュディレクトとして使用されますので、Webサーバーからの書き込みを許可します。書き込みを許可しないと、「Volt directory can’t be written」というメッセージが表示されます。VoltというのはPhalconのテンプレートエンジンです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
$ tree . └── test ├── app │ ├── cache │ ├── config │ │ ├── config.php │ │ ├── loader.php │ │ └── services.php │ ├── controllers │ │ ├── ControllerBase.php │ │ └── IndexController.php │ ├── models │ └── views │ ├── index │ │ └── index.volt │ ├── index.volt │ └── layouts ├── index.html └── public ├── css ├── files ├── img ├── index.php ├── js └── temp |
Model
チュートリアルを参考にして簡単なアプリケーションを書いてみます。
データベースはMySQLを使います。以下のテーブルを作ります。
1 2 3 4 5 6 |
CREATE TABLE `users` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(70) NOT NULL, `email` varchar(70) NOT NULL, PRIMARY KEY (`id`) ); |
app/config/config.phpのデータベース接続の設定を環境に合わせて編集し、以下のコマンドを実行します。
1 |
$ phalcon model users |
app/models/User.phpというファイルが作られます。
CRUD
作成したusersテーブルを編集する画面を作成します。
1 |
$ phalcon scaffold users --get-set --template-engine=volt |
app/controllers/UsersController.phpというファイルとviewsの下にテンプレートファイルがいくつか生成されます。
http://phalcon.local/users/にアクセスすると以下のページが表示されます。
このままでは、Create usersのリンクやSearchの結果ページのURLが無効になります。app/config/config.phpのbaseUriを”/”に変更します。
また、今回usersの属性にemailという項目があり、Developer Toolsが生成するコード中にEmailクラスを使用したvalidationが行われています。しかし、Emailクラスが見つからないと怒られますので、app/models/Users.phpに以下の行を追加します。
1 |
use Phalcon\Mvc\Model\Validator\Email; |
以上でusersテーブルを編集、検索画面が出来上がりました。
apache bench
apache benchでベンチマークをとってみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
This is ApacheBench, Version 2.3 <$Revision: 655654 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking phalcon.local (be patient) Completed 100 requests Completed 200 requests Completed 300 requests Completed 400 requests Completed 500 requests Completed 600 requests Completed 700 requests Completed 800 requests Completed 900 requests Completed 1000 requests Finished 1000 requests Server Software: Apache/2.2.22 Server Hostname: phalcon.local Server Port: 80 Document Path: /users/search Document Length: 1586 bytes Concurrency Level: 1 Time taken for tests: 12.566 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 2010000 bytes HTML transferred: 1586000 bytes Requests per second: 79.58 [#/sec] (mean) Time per request: 12.566 [ms] (mean) Time per request: 12.566 [ms] (mean, across all concurrent requests) Transfer rate: 156.20 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.0 0 0 Processing: 5 12 1.0 13 22 Waiting: 5 12 1.0 12 21 Total: 5 12 1.0 13 22 WARNING: The median and mean for the processing time are not within a normal deviation These results are probably not that reliable. WARNING: The median and mean for the total time are not within a normal deviation These results are probably not that reliable. Percentage of the requests served within a certain time (ms) 50% 13 66% 13 75% 13 80% 13 90% 13 95% 13 98% 13 99% 13 100% 22 (longest request) |
素のPHPを使って、usersテーブルからデータを取り出して表示するだけのコードのapache benchは以下の通りです。phalconがかなり遅くみえますが、phalconのコードには検索処理も含まれているためで、xhprofでプロファイリングしてみると一目瞭然です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
This is ApacheBench, Version 2.3 <$Revision: 655654 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking phalcon.local (be patient) Completed 100 requests Completed 200 requests Completed 300 requests Completed 400 requests Completed 500 requests Completed 600 requests Completed 700 requests Completed 800 requests Completed 900 requests Completed 1000 requests Finished 1000 requests Server Software: Apache/2.2.22 Server Hostname: phalcon.local Server Port: 80 Document Path: /result.php Document Length: 1499 bytes Concurrency Level: 1 Time taken for tests: 1.454 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 1728000 bytes HTML transferred: 1499000 bytes Requests per second: 687.75 [#/sec] (mean) Time per request: 1.454 [ms] (mean) Time per request: 1.454 [ms] (mean, across all concurrent requests) Transfer rate: 1160.58 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.0 0 0 Processing: 0 1 0.4 1 3 Waiting: 0 1 0.3 1 3 Total: 0 1 0.4 2 3 ERROR: The median and mean for the total time are more than twice the standard deviation apart. These results are NOT reliable. Percentage of the requests served within a certain time (ms) 50% 2 66% 2 75% 2 80% 2 90% 2 95% 2 98% 2 99% 2 100% 3 (longest request) |
少々長くなってしまいましたので、他のFrameworkとの性能比較は別の機会に譲ります。