0
PHP Framework
Phalcon
2013年10月23日(水)
林 正紀
@m_norii
http://norii.hatenablog.com/
自己紹介
•
•
•
•
•

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

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

• EventManagerとDIコンテナを利用したメインフ
ロー
• 3種類の構成を選択可能
• Singl...
動作要件
• PHP5.3以上
• 一部機能はPHP5.4以降で使うとパフォーマンス
面で有利とのこと
• PHP5.3系はすでにEOL迎えているので、新規案件で
適用するなら5.4/5.5系を利用すべき
リリース履歴
日時

Ver

履歴

2012-07-01

0.4

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

2012-...
導入事例
• RODEO という会社がソーシャルゲーム開発に
使っているらしい
• PHPカンファレンス2013でのフレームワークディス
カッション中の発表より
• http://www.rodeo.jp.net/
• http://www.s...
パフォーマンス比較 1
(秒間処理リクエスト数)
2535

851
354

489

541

568

860

1059

・いわゆる「Hello World」アプリ
ケーションでの比較
・ベンチ環境
Mac OS X Lion 10....
パフォーマンス比較2
(1リクエスト当たり処理時間
[ms])
2.82

2.05
1.85
1.37
1.17

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

46

46
30

27

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

1.50
1.25

1.25
1.10

1.00
0.75
爆速なのはわかったが・・・
• 実際に本当に爆速になるか?
・・・は、作るアプリケーションの質にも大き
く依る
• 投げるSQLがイケてなくて足引っ張ってると
か・・・
• PHP標準関数やクラス/Phalconで提供している機能
をわざわざ再...
機能一覧
ACL

Events

Security

Annotations

Filter

Session

CLI

Flash ※

Tag

Cache

Forms

Text

Config

Http

Translate

...
機能一覧:MVC
Application

User/Component

Controller

User/Module

Dispatcher

User/Plugin

Micro

View

Model

View/Engine/PH...
機能:モデル(1)
<?php
$cards = Card::find();//全件取得
$card = Card::findFirst(5); // ID 5を1件取得
$cards = Card::query()
->where('elem...
機能:モデル(2)集約関数
<?php
echo Card::count ();// SELECT count(*)
echo Card::sum(attack);
echo Card::average(defence);
echo Card:...
機能:Cache
• 標準で選択可能なBackend
•
•
•
•
•

File
Memcached
APC
Mongo
Xcache

• あれ、Redisは・・・(´・ω・`)
• https://github.com/phalcon/...
機能:テンプレートエンジン
(Volt)
• Twigライクな記法、Smartyとはちょっと違う
• エンジンは差し替え可能。Pure PHPも選べる
• Adapter書けばSmartyにも対応できる
• https://github.com...
機能:テンプレートエンジン
(Volt)
サンプル
コメント書式
{# app/views/products/show.volt #}
{% block last_products %}

制御文書式

{% for product in pr...
EventManager
• 「フレームワークがC実装だと、フレームワークの
挙動に関わる部分は全く手が入れられないの?」
• EventManagerを介して、フレームワークの各処理
ステージ中に処理を割りこませることができる
•
•
•
•...
Listenerクラスに通知
Controllerクラスに通知

EventManagerとEvent
Bootstrap
Routing

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

• 動作環境に依存して処理を変える箇所を、外部
から注入することで、疎結合性、テスト可用性
を確保
• 実...
3種類の構成
• Single-Module
• FuelPHP、CodeIgniterのような 1プロジェクト1アプ
リ構成

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

• Mi...
Single-Module
ディレクトリ構成
single/
app/
controllers/
models/
views/
public/
css/
img/
js/
Multi-Module
ディレクトリ構成
multiple/
apps/
frontend/
controllers/
models/
views/
Module.php
backend/
controllers/
models/
views...
Micro Framework
ディレクトリ構成

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

index.php

<?php
$app = new PhalconMvcMicro...
課題
• 日本語の情報が少ない
• 公式サイトも英語のみ

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

• C実装なのでメモリ周りの問題も報告が見...
雑感(設計周り)
• フルスタックアプリケーションの構成は
Zend Framework2に近い
• コントローラ名/アクション名の規則やViewファイ
ルの拡張子とか特に

• マイクロアプリケーションの構成はSilexっぽい
• ORマッパ...
雑感(実装周り:1)
• Webアプリに必要な機能はひととおり揃ってい
る
• 各種IDE用の補完用ファイルは有志が作ってる
• デバッグ用機能がちょっと弱い?
• Symfonyとかにあるデバッグツールバー欲しいよ
ね?
→「PHP Debu...
雑感(実装周り:2)
• いわゆる「開発/テスト/ステージ/商用」環境
別のアプリケーション構築法がデフォルトでは
提供されていない
• おそらくDIで外から注入せよという思想だと思われ
るが、他Frameworkでもだいたいある機能なので、
...
雑感(まとめ)
• Zend/Symfonyの設計思想を受けている印象なの
で、世間的に知られているパターンを適用した
アプリケーション構築はしやすそう
• DDD(Domain Driven Design)
• PofEAA(Patern o...
Upcoming SlideShare
Loading in...5
×

PHP framework Phalcon

28,676

Published on

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

Published in: Technology

Transcript of "PHP framework Phalcon"

  1. 1. PHP Framework Phalcon 2013年10月23日(水) 林 正紀 @m_norii http://norii.hatenablog.com/
  2. 2. 自己紹介 • • • • • 2000- NSW (SIer) 2004- CYBIRD (ガラケー全盛期) 2008- Bit Shift 2011- WINLIGHT (モバグリ・ソシャゲ全盛期) 2013- Trifort • Live in Fujimino, Saitama • Like • Music, Live (especially Mr.Children, Ikimonogakari) • Swimming
  3. 3. Phalcon:特徴 • C拡張での実装→速い/資源効率良い • 豊富な機能と疎結合なクラス群 • 使用する機能の取捨選択ができる • EventManagerとDIコンテナを利用したメインフ ロー • 3種類の構成を選択可能 • Single Module • Multi Module • Micro Framework • ライセンスは New BSD License
  4. 4. 動作要件 • PHP5.3以上 • 一部機能はPHP5.4以降で使うとパフォーマンス 面で有利とのこと • PHP5.3系はすでにEOL迎えているので、新規案件で 適用するなら5.4/5.5系を利用すべき
  5. 5. リリース履歴 日時 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ビルダー、Validator 2013-07-08 1.2.0 ModelCriteria 機能強化 ORMで多対多関連サポート 2013-07-25 1.2.1 Config/Json、バグフィックス 2013-08-06 1.2.2 バグフィックス、最適化 2013-08-16 1.2.3 (Change log無し)
  6. 6. 導入事例 • RODEO という会社がソーシャルゲーム開発に 使っているらしい • PHPカンファレンス2013でのフレームワークディス カッション中の発表より • http://www.rodeo.jp.net/ • http://www.slideshare.net/dzeyelid/introductionphalconatphpcon
  7. 7. パフォーマンス比較 1 (秒間処理リクエスト数) 2535 851 354 489 541 568 860 1059 ・いわゆる「Hello World」アプリ ケーションでの比較 ・ベンチ環境 Mac OS X Lion 10.7.4 Apache2.2.22(mod_rewrite無効) PHP5.3.15 (APC有効) CPU: 2.04GHz Intel Core i5 Memory: 4GB
  8. 8. パフォーマンス比較2 (1リクエスト当たり処理時間 [ms]) 2.82 2.05 1.85 1.37 1.17 1.16 0.99 0.39
  9. 9. パフォーマンス比較3 (読み込みPHPファイル数) 66 46 46 30 27 23 18 4
  10. 10. パフォーマンス比較4 (1Req当たりメモリ使用量 [MB]) 1.75 1.50 1.50 1.25 1.25 1.10 1.00 0.75
  11. 11. 爆速なのはわかったが・・・ • 実際に本当に爆速になるか? ・・・は、作るアプリケーションの質にも大き く依る • 投げるSQLがイケてなくて足引っ張ってると か・・・ • PHP標準関数やクラス/Phalconで提供している機能 をわざわざ再実装してるとか・・・ • なので、Phalconの性能を出し切るようなプロ グラムを心がける必要がある
  12. 12. 機能一覧 ACL Events Security Annotations Filter Session CLI Flash ※ Tag Cache Forms Text Config Http Translate Crypt Kernel Validation DI Loader Version Db Logger Debug MVC Dispatcher Paginator Escaper Queue ※Flash はAdobe Flashではなく、複数リクエストをまたいでメッセージ を受け渡すもの
  13. 13. 機能一覧:MVC Application User/Component Controller User/Module Dispatcher User/Plugin Micro View Model View/Engine/PHP Url View/Engine/Volt
  14. 14. 機能:モデル(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のカーソルを利用して取得しているのでメモリ をあまり使わない
  15. 15. 機能:モデル(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マッパとしてのモデルは使わな いという選択もできる
  16. 16. 機能:Cache • 標準で選択可能なBackend • • • • • File Memcached APC Mongo Xcache • あれ、Redisは・・・(´・ω・`) • https://github.com/phalcon/incubator/blob/master/Libr ary/Phalcon/Cache/Backend/Redis.php
  17. 17. 機能:テンプレートエンジン (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使う意味ある の?な感
  18. 18. 機能:テンプレートエンジン (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 %} 変数出力書式
  19. 19. EventManager • 「フレームワークがC実装だと、フレームワークの 挙動に関わる部分は全く手が入れられないの?」 • EventManagerを介して、フレームワークの各処理 ステージ中に処理を割りこませることができる • • • • • • • beforeDispatchLoop beforeDispatch beforeExecuteRoute initialize afterExecuteRoute beforeNotFoundAction など http://docs.phalconphp.com/en/latest/reference/dispatching .html • 上記以外、DB関連も細かいイベントが設定されていて、 Listenできる仕掛けになっている
  20. 20. Listenerクラスに通知 Controllerクラスに通知 EventManagerとEvent Bootstrap Routing BeforeDispatchLoopイベント BeforeDispatchイベント Dispatch BeforeExecuteRouteイベント Controller/Action AfterExecuteRouteイベント AfterDispatchイベント AfterDispatchLoopイベント Response
  21. 21. DIコンテナ/サービスロケータ • 複数クラスで使いまわすオブジェクトを管理 • 例:MVC内のRequest/Responseクラス • 動作環境に依存して処理を変える箇所を、外部 から注入することで、疎結合性、テスト可用性 を確保 • 実行環境用とUnitTest用Requestクラス • 開発/テスト/ステージ/商用環境 • http://docs.phalconphp.com/en/latest/reference/di.htm l
  22. 22. 3種類の構成 • Single-Module • FuelPHP、CodeIgniterのような 1プロジェクト1アプ リ構成 • Multi-Module • Zend、Symfonyのような1プロジェクト内に複数アプ リの構成 • Micro Framework • Silexのようなシンプルなアプリケーションを素早く 作るためのコンパクトなフレームワーク
  23. 23. Single-Module ディレクトリ構成 single/ app/ controllers/ models/ views/ public/ css/ img/ js/
  24. 24. Multi-Module ディレクトリ構成 multiple/ apps/ frontend/ controllers/ models/ views/ Module.php backend/ controllers/ models/ views/ Module.php public/ css/ img/ js/
  25. 25. Micro Framework ディレクトリ構成 my-rest-api/ models/ Robots.php index.php .htaccess index.php <?php $app = new PhalconMvcMicro(); $app->get('/api/robots', function() { //Do something }); $app->post('/api/robots', function() { //Do something }); $app->handle();
  26. 26. 課題 • 日本語の情報が少ない • 公式サイトも英語のみ • 内部で動作しているか詳細を調べるのが(PHP実 装のフレームワークと比して)難しい • Cソースは公開されているのでそれを読めばいいが • C実装なのでメモリ周りの問題も報告が見受け られる • https://github.com/phalcon/cphalcon/blob/master/CHA NGELOG • 開発自体はそれなりにアクティブなので、patch投 げれば修正してくれるかも
  27. 27. 雑感(設計周り) • フルスタックアプリケーションの構成は Zend Framework2に近い • コントローラ名/アクション名の規則やViewファイ ルの拡張子とか特に • マイクロアプリケーションの構成はSilexっぽい • ORマッパはDoctrineっぽい • テンプレートエンジン(Volt)はTwigっぽい • これらをいいとこどりしてCで実装したみたい なところか
  28. 28. 雑感(実装周り:1) • Webアプリに必要な機能はひととおり揃ってい る • 各種IDE用の補完用ファイルは有志が作ってる • デバッグ用機能がちょっと弱い? • Symfonyとかにあるデバッグツールバー欲しいよ ね? →「PHP Debug Bar」という汎用的なのがあるのでこ れと連携させれば。 http://phpdebugbar.com/ Phalconと連携させてる人もいた http://sankame.github.io/PHPDebugBar/2013/09/23/ph p_debug_bar_install/
  29. 29. 雑感(実装周り:2) • いわゆる「開発/テスト/ステージ/商用」環境 別のアプリケーション構築法がデフォルトでは 提供されていない • おそらくDIで外から注入せよという思想だと思われ るが、他Frameworkでもだいたいある機能なので、 最初の導入時にあってもいいのでは。 • 公式ドキュメントどおりに構築していくと、 index.phpの記述がカオスになりそう • ZendのようにBootstrapクラスをちゃんと作って、 index.phpは薄く保つのがいいのではないか。
  30. 30. 雑感(まとめ) • 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) なアプリケーションを構築すれば、 真に爆速なサービスを提供できる
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×