phalcon + angularjsで作る動画プラットフォーム

29
Phalcon + AngularJS 2014 8 5 Phalcon Night

Upload: ryo-utsunomiya

Post on 29-Nov-2014

4.286 views

Category:

Engineering


0 download

DESCRIPTION

Phalcon Night(2014年8月5日) 発表資料 スライドはreveal.js製。完全版は以下のGitHub Pagesにあります。 https://ryo-utsunomiya.github.io/phalcon_night_01/ SlideShareへのアップロード時にp.18のBaseモデルの生成コマンドの表示が崩れてしまっていますが、正しいコマンドは以下です。 phalcon model \ --namespace=App\\Models\\Base \ --extends=\\App\\Models\\AbstractModel \ --output=app/models/Base \ --name=TABLE_NAME

TRANSCRIPT

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

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

(2014年8月5日)Phalcon Night

アシアル株式会社 宇都宮諒

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

自己紹介

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

宇都宮 諒(Utsunomiya Ryo)

所属PHPエンジニアPHP歴3年 Phalcon歴5ヶ月Phalcon ドキュメント日本語翻訳チーム レビュアー

アシアル株式会社

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

アジェンダ

アプリケーション概要アーキテクチャアプリケーション設計Phalconを使う上での工夫・苦労

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

アプリケーション概要

B2Bのクローズドな動画プラットフォーム→イメージは「組織ごとに閉じたYoutube」様々な動画を会社等の組織内で共有したい動画の一部を切り出したり、プレイリストを作ったりしたい動画は、Web及びアプリで視聴したい既存システム( 製)を全面的に改修したい今年の8月から本番運用開始したい(サービスイン当初の顧客は1社)

Zend

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

アーキテクチャ

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

インフラ:Azure動画配信やエンコード等のサービス( )を利用するために採用。しかし、諸事情によりAzure Media Servicesの利用は取りやめに。結果的には、「mp4で配信」「 でエンコード」という形式に落ち着いた。現在、Azureの機能で使ってるのは仮想マシンとストレージ。

Azure Media Services

FFmpeg

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

サーバ構成

Web+DBサーバ: 1台エンコードサーバー: 複数台

今のところ負荷は大きくないので、Web+DBは1台に集約している。 エンコードはマシンパワーが必要なので、サービスイン当初から複数台構成。

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

システム構成

CentOSApacheMySQLPHP

既存システムの構成をそのまま流用。Nginxは検討したが、今のところ不要だと考え、既存のApacheをそのまま使用。

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

アプリケーション構成

動画編集Web(AngularJS)動画配信Web(jQuery等)動画配信アプリバックエンドWeb API(Phalcon)

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

Phalconを選んだ理由動作が速いアーキテクチャが割とモダン(PHP5.3+)シンプルなAPI

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

工夫したこと(1):Viewの作り方

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

Viewの作り方1. Webでは、当初から を使う予定だった。2. Phalconのテンプレートエンジン・ の記法は、Angularの記法とバッティングする。→ViewにはVoltを使用せず、生PHPをテンプレートとして使うことに。

3. Viewの描画はほぼAngularに任せ、PHPは最低限のレイアウトのみを受け持つ。

AngularJSVolt

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

工夫したこと(2):モデルの構成

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

プロジェクトの雛形

で生成できる。micro / simple / modules の3タイプがある。今回のアプリでは、modules構成を使用。

Phalcon DevTools

$ phalcon project PROJECT_NAME --type=modules

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

ディレクトリ構成├── apps│ ├── editor│ │ ├── config│ │ ├── controllers│ │ ├── models│ │ └── views│ └── viewer (中の構成はeditorと同様)├── config├── models│ └── Base├── public├── tasks├── tests└── vendor

コマンドによる生成直後のmodules構成は、モデルがモジュールごとに分かれているが、共通モデルはアプリケーション

ルート直下のmodelsにまとめた。 各モジュールのmodelsにはフォーム等、モジュール固有のク

ラスを入れてある。

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

DBスキーマ以下の手順でDBスキーマとモデルクラスの管理を行った。

1. でER図作成2. WorkbenchのForward Engineer機能でスキーマ定義のSQL文を生成

3. スキーマ定義SQLを使用してDBにテーブル作成4. DBに存在するテーブルを元に、phalcon modelコマンドで

Baseモデルを生成

MySQL Workbench

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

Baseモデルとは?DBスキーマを更新したら、Baseモデルも全て作り直す。Baseモデルは自動生成を行う。開発者はBaseモデルには触らない。モデルに共通で持たせたい処理(ビヘイビア等)はBaseモデルの親(AbstractModel)に実装する。AbstractModelは、Phalcon\Mvc\Model を継承する。アプリケーション内で使用するモデルは、Baseモデルを継承する。Baseモデルの生成は以下のようなコマンドで行う。

$ phalcon model \--namespace=App\\Models\\Base \--extends=\\App\\Models\\AbstractModel \--output=app/models/Base \--name=TABLE_NAME

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

苦労したこと(1):フレームワーク本体のバグ

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

Phalcon使用時に遭遇する特徴的なエラーメッセージ

zend_mm_heap corruptedSegmentation fault

どちらも原因は不正なメモリアクセス。Segmentation faultはPHPコードにも原因があることが多い。一方、zend_mm_heap corruptedはフレームワークのバグ。経験上、モデルのプロパティ操作の際に発生しやすい。

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

Phalcon本体のバグの対処法1. 最新版のPhalconを使う。2. 止まっている箇所を特定する。3. 止まっている原因のクラス・メソッドが分かったら、

GitHubにIssueが上がってないか確認する(回避策が載ってるかも)。

4. 止まっている箇所のコードを色々変更してみる(大体これで回避できる)。

5. 止まっているクラス・メソッドのPhalcon本体のソースコードを読んでみる(回避策が分かるかも)。

大きな変更の直後にエラーが発生すると、原因究明が大変。こまめにコミット→テストのサイクルを走らせることで、対

処しやすくなる。

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

不具合を検知する体制を作る

CI( )ユニットテスト( )APIテスト( )(今回は導入しなかったが) も有効

JenkinsPHPUnit

Frisby.jsSelenuim

Phalconのバグによるエラーは、予測が困難。発生したらすぐに検知できる体制を作る必要がある。

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

苦労したこと(2):ドキュメント

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

Phalconのドキュメントの弱点(1):APIリファレンス

PhalconのAPIリファレンスは、ソースコードから自動生成している。→ソースコードのコメントが誤っていると、APIリファレンスまでおかしくなる。自動生成スクリプトにバグがあり、正常にパラメータを取れていないことがある。例:Phalcon\Http\Request::getJsonRawBody()の第1引数は、 には載っているが、には載っていない。ソースのDocコメント APIリファレ

ンス

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

Phalconのドキュメントの弱点(2): 翻訳Phalconのドキュメントで日本語になっているのは、全体の10%程度。実は、20%ほど翻訳は進んでいるのだけど、リリースされていない。。。翻訳に興味の有る方いらっしゃれば是非。貢献方法:CONTRIBUTING.md

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

これから苦労しそうなこと:バージョンアップ

Phalconの現行バージョン(1.3.2)はまだ不安定な部分があるので、継続して開発していく上で、より安定したバージョンに差し替えたい。Phalcon 2では、PHP拡張のビルドに という中間言語を挟むようになるが、まだ不安定で、環境によってはZephirコンパイラのビルドにこける…Phalcon 2の初期バージョンは、1系とのAPI互換性が保証されてるので、その点は割と安心。

Zephir

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

まとめ

「Phalconだから特別な何かをしないといけない」ということはほとんど無い。普通に作れば普通に動く。現時点では荒削りな部分もある。

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

【宣伝】アシアル株式会社で提供中のサービス

(HTML5モバイルアプリ開発プラットフォーム)受託開発(Webシステム・モバイルアプリ)スクール( ・企業研修)

Monaca

アシアル塾

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

ご清聴ありがとうございました。

http://ryo-utsunomiya.github.io/phalcon_night_01/