Phalcon + AngularJSで作る動画プラットフォーム
(2014年8月5日)Phalcon Night
アシアル株式会社宇都宮諒
自己紹介
宇都宮 諒(UtsunomiyaRyo)
所属
PHPエンジニア
PHP歴3年Phalcon歴5ヶ月
Phalcon ドキュメント日本語翻訳チームレビュアー
アシアル株式会社
アジェンダ
アプリケーション概要
アーキテクチャ
アプリケーション設計
Phalconを使う上での工夫・苦労
アプリケーション概要
B2Bのクローズドな動画プラットフォーム
→イメージは「組織ごとに閉じたYoutube」
様々な動画を会社等の組織内で共有したい
動画の一部を切り出したり、プレイリストを作ったりした
い
動画は、Web及びアプリで視聴したい
既存システム( 製)を全面的に改修したい
今年の8月から本番運用開始したい(サービスイン当初の
顧客は1社)
Zend
アーキテクチャ
インフラ:Azure
動画配信やエンコード等のサービス( )
を利用するために採用。
しかし、諸事情によりAzure MediaServicesの利用は取りや
めに。
結果的には、「mp4で配信」「 でエンコード」とい
う形式に落ち着いた。
現在、Azureの機能で使ってるのは仮想マシンとストレー
ジ。
Azure MediaServices
FFmpeg
サーバ構成
Web+DBサーバ: 1台
エンコードサーバー: 複数台
今のところ負荷は大きくないので、
Web+DBは1台に集約している。
エンコードはマシンパワーが必要なので、
サービスイン当初から複数台構成。
システム構成
CentOS
Apache
MySQL
PHP
既存システムの構成をそのまま流用。
Nginxは検討したが、今のところ不要だと
考え、既存のApacheをそのまま使用。
アプリケーション構成
動画編集Web(AngularJS)
動画配信Web(jQuery等)
動画配信アプリ
バックエンドWeb API(Phalcon)
Phalconを選んだ理由
動作が速い
アーキテクチャが割とモダン(PHP5.3+)
シンプルなAPI
工夫したこと(1):Viewの作り方
Viewの作り方
1. Webでは、当初から を使う予定だった。
2. Phalconのテンプレートエンジン・ の記法は、Angular
の記法とバッティングする。
→ViewにはVoltを使用せず、生PHPをテンプレートとして
使うことに。
3. Viewの描画はほぼAngularに任せ、PHPは最低限のレイアウ
トのみを受け持つ。
AngularJS
Volt
工夫したこと(2):モデルの構成
プロジェクトの雛形
で生成できる。
micro /simple /modules の3タイプがある。
今回のアプリでは、modules構成を使用。
Phalcon DevTools
$ phalcon project PROJECT_NAME --type=modules
ディレクトリ構成
├── apps
│ ├── editor
│ │ ├── config
│ │ ├── controllers
│ │ ├── models
│ │ └── views
│ └── viewer (中の構成はeditorと同様)
├── config
├── models
│ └── Base
├── public
├── tasks
├── tests
└── vendor
コマンドによる生成直後のmodules構成は、モデルがモジュ
ールごとに分かれているが、共通モデルはアプリケーション
ルート直下のmodelsにまとめた。
各モジュールのmodelsにはフォーム等、モジュール固有のク
ラスを入れてある。
DBスキーマ
以下の手順でDBスキーマとモデルクラスの管理を行った。
1. でER図作成
2. WorkbenchのForward Engineer機能でスキーマ定義のSQL
文を生成
3. スキーマ定義SQLを使用してDBにテーブル作成
4. DBに存在するテーブルを元に、phalcon modelコマンドで
Baseモデルを生成
MySQL Workbench
Baseモデルとは?
DBスキーマを更新したら、Baseモデルも全て作り直す。
Baseモデルは自動生成を行う。開発者はBaseモデルには触
らない。
モデルに共通で持たせたい処理(ビヘイビア等)はBaseモ
デルの親(AbstractModel)に実装する。
AbstractModelは、PhalconMvcModelを継承する。
アプリケーション内で使用するモデルは、Baseモデルを継
承する。
Baseモデルの生成は以下のようなコマンドで行う。
$ phalcon model 
--namespace=AppModelsBase 
--extends=AppModelsAbstractModel 
--output=app/models/Base 
--name=TABLE_NAME
苦労したこと(1):
フレームワーク本体のバグ
Phalcon使用時に遭遇する特徴的なエラーメッセージ
zend_mm_heap corrupted
Segmentation fault
どちらも原因は不正なメモリアクセス。
Segmentation faultはPHPコードにも原因があることが多い。
一方、zend_mm_heap corruptedはフレームワークのバグ。
経験上、モデルのプロパティ操作の際に発生しやすい。
Phalcon本体のバグの対処法
1. 最新版のPhalconを使う。
2. 止まっている箇所を特定する。
3. 止まっている原因のクラス・メソッドが分かったら、
GitHubにIssueが上がってないか確認する(回避策が載って
るかも)。
4. 止まっている箇所のコードを色々変更してみる(大体これ
で回避できる)。
5. 止まっているクラス・メソッドのPhalcon本体のソースコー
ドを読んでみる(回避策が分かるかも)。
大きな変更の直後にエラーが発生すると、原因究明が大変。
こまめにコミット→テストのサイクルを走らせることで、対
処しやすくなる。
不具合を検知する体制を作る
CI( )
ユニットテスト( )
APIテスト( )
(今回は導入しなかったが) も有効
Jenkins
PHPUnit
Frisby.js
Selenuim
Phalconのバグによるエラーは、予測が困難。
発生したらすぐに検知できる体制を作る必要がある。
苦労したこと(2):ドキュメント
Phalconのドキュメントの弱点(1):
APIリファレンスPhalconのAPIリファレンスは、ソースコードから自動生成
している。
→ソースコードのコメントが誤っていると、APIリファレ
ンスまでおかしくなる。
自動生成スクリプトにバグがあり、正常にパラメータを取
れていないことがある。
例:PhalconHttpRequest::getJsonRawBody()の第1引数
は、 には載っているが、
には載っていない。
ソースのDocコメント APIリファレ
ンス
Phalconのドキュメントの弱点(2): 翻訳
Phalconのドキュメントで日本語になっているのは、全体の
10%程度。
実は、20%ほど翻訳は進んでいるのだけど、リリースされ
ていない。。。
翻訳に興味の有る方いらっしゃれば是非。
貢献方法:CONTRIBUTING.md
これから苦労しそうなこと:
バージョンアップ
Phalconの現行バージョン(1.3.2)はまだ不安定な部分がある
ので、継続して開発していく上で、より安定したバージョ
ンに差し替えたい。
Phalcon 2では、PHP拡張のビルドに という中間言語
を挟むようになるが、まだ不安定で、環境によっては
Zephirコンパイラのビルドにこける…
Phalcon 2の初期バージョンは、1系とのAPI互換性が保証さ
れてるので、その点は割と安心。
Zephir
まとめ
「Phalconだから特別な何かをしないといけない」というこ
とはほとんど無い。
普通に作れば普通に動く。
現時点では荒削りな部分もある。
【宣伝】
アシアル株式会社で提供中のサービス
(HTML5モバイルアプリ開発プラットフォーム)
受託開発(Webシステム・モバイルアプリ)
スクール( ・企業研修)
Monaca
アシアル塾
ご清聴ありがとうございました。
http://ryo-utsunomiya.github.io/phalcon_night_01/

Phalcon + AngularJSで作る動画プラットフォーム