php framework phalcon

30
PHP Framework Phalcon 2013 年 10 年 23 年 ( 年 ) 年 年年 @m_norii http://norii.hatenablog.com/

Upload: masanori-hayashi

Post on 26-May-2015

28.468 views

Category:

Technology


0 download

DESCRIPTION

2013/10/23 社内勉強会の資料

TRANSCRIPT

Page 1: PHP framework Phalcon

PHP FrameworkPhalcon

2013 年 10 月 23 日 ( 水 )林 正紀

@m_noriihttp://norii.hatenablog.com/

Page 2: PHP framework Phalcon

自己紹介• 2000- NSW (SIer)• 2004- CYBIRD ( ガラケー全盛期 )• 2008- Bit Shift• 2011- WINLIGHT ( モバグリ・ソシャゲ全盛期 )• 2013- Trifort

• Live in Fujimino, Saitama• Like

• Music, Live (especially Mr.Children, Ikimonogakari)• Swimming

Page 3: PHP framework Phalcon

Phalcon :特徴• C 拡張での実装→速い / 資源効率良い• 豊富な機能と疎結合なクラス群• 使用する機能の取捨選択ができる

• EventManager と DI コンテナを利用したメインフロー• 3 種類の構成を選択可能• Single Module• Multi Module• Micro Framework

• ライセンスは New BSD License

Page 4: PHP framework Phalcon

動作要件• PHP5.3 以上• 一部機能は PHP5.4 以降で使うとパフォーマン

ス面で有利とのこと• PHP5.3 系はすでに EOL 迎えているので、新規案件

で適用するなら 5.4/5.5 系を利用すべき

Page 5: PHP framework Phalcon

リリース履歴日時 Ver 履歴2012-07-01 0.4 Memcache による結果セットのキャッシュ

DB メタデータの永続化PostgreSQL をサポート正規表現によるルーティング、多言語対応、仮想外部キー

2012-09-08 0.5.0 Event Manager/DI コンテナの導入2012-10-31 0.6 MongoDB サポート2013-03-20 1.0.0 Form ビルダー、 Validator2013-07-08 1.2.0 Model\Criteria 機能強化

ORM で多対多関連サポート2013-07-25 1.2.1 Config/Json 、バグフィックス2013-08-06 1.2.2 バグフィックス、最適化2013-08-16 1.2.3 (Change log 無し )

Page 6: PHP framework Phalcon

導入事例• RODEO という会社がソーシャルゲーム開発に

使っているらしい• PHP カンファレンス 2013 でのフレームワークディ

スカッション中の発表より• http://www.rodeo.jp.net/• http://www.slideshare.net/dzeyelid/introduction-phalco

natphpcon

Page 7: PHP framework Phalcon

パフォーマンス比較 1( 秒間処理リクエスト数 )

354489 541 568

851 8601059

2535

・いわゆる「 Hello World 」アプリケーションでの比較・ベンチ環境Mac OS X Lion 10.7.4Apache2.2.22(mod_rewrite 無効 )PHP5.3.15 (APC 有効 )CPU: 2.04GH z Intel Core i5Memory: 4GB

Page 8: PHP framework Phalcon

パフォーマンス比較 2(1 リクエスト当たり処理時間 [ms])

2.82

2.051.85

1.371.17 1.16

0.99

0.39

Page 9: PHP framework Phalcon

パフォーマンス比較 3( 読み込み PHP ファイル数 )

66

46 46

3027

2318

4

Page 10: PHP framework Phalcon

パフォーマンス比較 4(1Req 当たりメモリ使用量[MB])

1.75

1.50 1.50

1.25 1.25

1.101.00

0.75

Page 11: PHP framework Phalcon

爆速なのはわかったが・・・• 実際に本当に爆速になるか?

・・・は、作るアプリケーションの質にも大きく依る

• 投げる SQL がイケてなくて足引っ張ってるとか・・・• PHP 標準関数やクラス /Phalcon で提供している機能

をわざわざ再実装してるとか・・・

• なので、 Phalcon の性能を出し切るようなプログラムを心がける必要がある

Page 12: PHP framework Phalcon

機能一覧ACL Events Security

Annotations Filter Session

CLI Flash ※ Tag

Cache Forms Text

Config Http Translate

Crypt Kernel ValidationDI Loader VersionDb LoggerDebug MVCDispatcher PaginatorEscaper Queue

※Flash は Adobe Flash ではなく、複数リクエストをまたいでメッセージを受け渡すもの

Page 13: PHP framework Phalcon

機能一覧: MVCApplication User/Component

Controller User/Module

Dispatcher User/Plugin

Micro View

Model View/Engine/PHP

Url View/Engine/Volt

Page 14: PHP framework Phalcon

機能:モデル (1)<?php

$cards = Card::find();// 全件取得$card = Card::findFirst(5); // ID 5 を 1 件取得$cards = Card::query()

->where('element = :element:')

->bind(array('element' => 1))

->order('rarity')

->execute(); // メソッドチェーンによる記法// 複数件帰ってくるメソッドの返値の型は「 ResultSet 」。 Trabarsable なので foreachで繰り返し処理ができるforeach($cards as $card){

//do something

}

// この処理は、 Phalcon の内部では DB のカーソルを利用して取得しているのでメモリをあまり使わない

Page 15: PHP framework Phalcon

機能:モデル (2) 集約関数<?php

echo Card::count ();// SELECT count(*)

echo Card::sum(attack);

echo Card::average(defence);

echo Card::maximum(rarity);

echo Card::minimum(cost);

・その他、 Insert/Update/Delete は Doctrine ( Symfony の OR マッパ)とだいたい同じ・任意の SQL を投げる機能もあるので、 OR マッパとしてのモデルは使わないという選択もできる

Page 16: PHP framework Phalcon

機能: Cache

• 標準で選択可能な Backend• File• Memcached• APC• Mongo• Xcache

• あれ、 Redis は・・・ (´ ・ ω ・` )• https://github.com/phalcon/incubator/blob/master/Libr

ary/Phalcon/Cache/Backend/Redis.php

Page 17: PHP framework Phalcon

機能:テンプレートエンジン(Volt)• Twig ライクな記法、 Smarty とはちょっと違う• エンジンは差し替え可能。 Pure PHP も選べる• Adapter 書けば Smarty にも対応できる• https://github.com/phalcon/incubator/blob/master/Libr

ary/Phalcon/Mvc/View/Engine/Smarty.php• でも、テンプレートの Parse ってコスト高い処理なので、

そこを PHP 実装の Smarty でやるのは Phalcon 使う意味あるの?な感

Page 18: PHP framework Phalcon

機能:テンプレートエンジン(Volt)サンプル{# app/views/products/show.volt #}

{% block last_products %}

{% for product in products %}

* Name: {{ product.name|e }}

{% if product.status == "Active" %}

Price: {{ product.price + product.taxes/100 }}

{% endif %}

{% endfor %}

{% endblock %}

コメント書式

制御文書式

変数出力書式

Page 19: PHP framework Phalcon

EventManager

• 「フレームワークが C 実装だと、フレームワークの挙動に関わる部分は全く手が入れられないの?」• EventManager を介して、フレームワークの各処理ステー

ジ中に処理を割りこませることができる• beforeDispatchLoop• beforeDispatch• beforeExecuteRoute• initialize• afterExecuteRoute• beforeNotFoundAction など• http://docs.phalconphp.com/en/latest/reference/dispatching.html• 上記以外、 DB 関連も細かいイベントが設定されてい

て、 Listen できる仕掛けになっている

Page 20: PHP framework Phalcon

EventManager と EventBootstrap

Routing

Dispatch

Controller/Action

Response

BeforeExecuteRoute イベント

AfterExecuteRoute イベント

BeforeDispatchLoop イベント

BeforeDispatch イベント

AfterDispatch イベント

AfterDispatchLoop イベント

Listener クラスに通知

Controller クラスに通知

Page 21: PHP framework Phalcon

DI コンテナ / サービスロケータ• 複数クラスで使いまわすオブジェクトを管理• 例: MVC 内の Request/Response クラス

• 動作環境に依存して処理を変える箇所を、外部から注入することで、疎結合性、テスト可用性を確保• 実行環境用と UnitTest 用 Request クラス• 開発 / テスト / ステージ /商用環境• http://docs.phalconphp.com/en/latest/reference/di.htm

l

Page 22: PHP framework Phalcon

3 種類の構成• Single-Module• FuelPHP 、 CodeIgniter のような 1 プロジェクト 1 ア

プリ構成• Multi-Module• Zend 、 Symfony のような 1 プロジェクト内に複数

アプリの構成• Micro Framework• Silex のようなシンプルなアプリケーションを素早

く作るためのコンパクトなフレームワーク

Page 23: PHP framework Phalcon

Single-Module

ディレクトリ構成single/ app/ controllers/ models/ views/ public/ css/ img/ js/

Page 24: PHP framework Phalcon

Multi-Moduleディレクトリ構成multiple/ apps/ frontend/ controllers/ models/ views/ Module.php backend/ controllers/ models/ views/ Module.php public/ css/ img/ js/

Page 25: PHP framework Phalcon

Micro Framework

ディレクトリ構成

my-rest-api/ models/ Robots.php index.php .htaccess

index.php

<?php$app = new Phalcon\Mvc\Micro();

$app->get('/api/robots', function() { //Do something});

$app->post('/api/robots', function() { //Do something});

$app->handle();

Page 26: PHP framework Phalcon

課題• 日本語の情報が少ない• 公式サイトも英語のみ

• 内部で動作しているか詳細を調べるのが (PHP実装のフレームワークと比して )難しい• C ソースは公開されているのでそれを読めばいいが

• C 実装なのでメモリ周りの問題も報告が見受けられる• https://

github.com/phalcon/cphalcon/blob/master/CHANGELOG• 開発自体はそれなりにアクティブなので、 patch 投

げれば修正してくれるかも

Page 27: PHP framework Phalcon

雑感 (設計周り )

• フルスタックアプリケーションの構成はZend Framework2 に近い• コントローラ名 / アクション名の規則や View ファ

イルの拡張子とか特に• マイクロアプリケーションの構成は Silex っぽ

い• OR マッパは Doctrine っぽい• テンプレートエンジン (Volt) は Twig っぽい• これらをいいとこどりして C で実装したみたい

なところか

Page 28: PHP framework Phalcon

雑感(実装周り :1 )• Web アプリに必要な機能はひととおり揃っている•各種 IDE 用の補完用ファイルは有志が作ってる• デバッグ用機能がちょっと弱い?• Symfony とかにあるデバッグツールバー欲しいよね?

→「 PHP Debug Bar 」という汎用的なのがあるのでこれと連携させれば。http://phpdebugbar.com/Phalcon と連携させてる人もいたhttp://sankame.github.io/PHPDebugBar/2013/09/23/php_debug_bar_install/

Page 29: PHP framework Phalcon

雑感(実装周り :2 )• いわゆる「開発 / テスト / ステージ /商用」環

境別のアプリケーション構築法がデフォルトでは提供されていない• おそらく DI で外から注入せよという思想だと思わ

れるが、他 Framework でもだいたいある機能なので、最初の導入時にあってもいいのでは。

•公式ドキュメントどおりに構築していくと、 index.php の記述がカオスになりそう• Zend のように Bootstrap クラスをちゃんと作って、

index.php は薄く保つのがいいのではないか。

Page 30: PHP framework Phalcon

雑感(まとめ)• Zend/Symfony の設計思想を受けている印象なの

で、世間的に知られているパターンを適用したアプリケーション構築はしやすそう• DDD ( Domain Driven Design )• PofEAA ( Patern of Enterprise Application Architecture )

• フレームワークの機能をフルに活かして、 KISS(Keep It Simple & Small)DRY(Don't Repeat Yourself)YAGNI ( You Aren't Gonna Need It )なアプリケーションを構築すれば、真に爆速なサービスを提供できる