Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Yet another use of Phalcon

17,023 views

Published on

Published in: Technology
  • Be the first to comment

Yet another use of Phalcon

  1. 1. Yet another use of phalcon ⾮非公式なPhalconの使い⽅方 株式会社ソニックムーブ
  2. 2. About me Yuji Iwai(鰯) @104 株式会社ソニックムーブ 2012年年2⽉月⼊入社 アプリケーション開発&インフラ構築とかを⽣生業にしてます ⾔言語: PHP(3y)/Perl(7y)/Python(1y)/Objective-C(1y) フレームワーク: symfony1.4/Silex/Codeigniter Phalcon歴: 1年年ちょっと 社内で最初にPhalconを導⼊入した⼈人
  3. 3. 株式会社ソニックムーブについて 場所:神楽坂 徒歩3分くらい •  ソーシャルゲーム •  モバイルアプリ •  受託開発 いろいろやってる
  4. 4. Phalconを使ってるサービス その他にも アプリバックエンドや 受託案件等多数で採⽤用 たぶん10プロジェクト 以上で使ってると思う
  5. 5. 導⼊入の経緯 2013年年初頃 AWSをソーシャルゲームに導⼊入をはじめた ソーシャルゲームを AWS:c1.mediam で運⽤用開始 CPU使⽤用率率率低いのに  なんか  レスポンス遅くなる Apacheの並列列数増やしたいけどメモリ⾜足りない 1プロセス100MB以上使ってる CPU使い切切ってないのに m1.large に移⾏行行 最低コストが上がる EC2を使い切切りたい!!
  6. 6. 導⼊入後 •  メモリに起因したパフォーマンス劣劣化は発⽣生し てない •  CPUがボトルネックになる(健全) –  もしくは外部リソースがボトルネック •  プロセスあたり30MBになった •  EC2: t1.micro/m1.small でもそこそこの性能 が出る、最近は t2 系に移⾏行行中 何よりフレームワークのパフォーマンス改善が必 要なくなった
  7. 7. サーバ構成について App –  Nginx + php-fpm –  PHP v5.4 (Non APC) –  Phalcon v1.3.1 –  Memcached –  fluentd Worker –  Upstart –  start-stop-daemon DynamoDB, SQS, SNS, RDS, ElastiCache(Redis)
  8. 8. 使いはじめて不不満だったこと •  設定を  ini じゃなくてYAMLで書きたい •  RoutingもAnnotationじゃなくてYAMLがいい •  Composer使えるかな •  Volt が … coredump ↓↓↓↓↓ 社内で普及させるには乗り換えやすくしたい Symfony1.4 → Phalcon レガシー → モダン
  9. 9. ソニックムーブでPhalconを使うときの 標準的なアレコレ
  10. 10. ディレクトリ構成
  11. 11. PSR-0 準拠でシンプル化 ComposerのAutoloaderで メリット Phalconの  registerNamespace とか不不要 本来の推奨構成に沿ってないので⾮非推奨…
  12. 12. RoutingをYAMLで定義 社内向けに作った ライブラリだけど、 近いうちに公開します
  13. 13. ServiceProviderを実装 Laravel や  Silex などで実装されている ServiceProviderをPhalconで実装できるようにした メリット –  ライブラリの導⼊入が簡単になった –  だれでも、すぐに使い始められるようになった –  DI Componentの⽣生成プロセスを隠蔽 –  Componentを登録して設定するだけ –  設定の使いまわしができるようになった デメリット –  ⽣生成プロセスがServiceProviderに依存 –  設定の複雑化
  14. 14. Applicationを拡張 Applicationクラスへ registerメソッドの追加 Phalconのhandleを overrideして、 boot処理理を追加するだけ
  15. 15. ServiceProviderInterfaceを定義
  16. 16. CacheServiceProviderの例例
  17. 17. ServiceProviderの使い⽅方
  18. 18. ServiceProviderの使い⽅方 さらにこの設定を YAMLから読み込むように 変更更して  index.php は シンプルに index.php は Component の登録と 設定(依存性)の注⼊入だけ
  19. 19. ServiceProviderがやたら増えた ServiceProviderの実装は簡単なので、やたら増えた –  database-service-provider –  volt-service-provider –  cache-service-provider –  aws-service-provider –  gaufrette-service-provider –  elasticsearch-service-provider などなど… 外部ライブラリを使うときは、まず  ServiceProvider をつくってしまう、⾮非公式だけどオススメ
  20. 20. コントローラーで気をつけるべきこと •  redirect したら、return しろ – LocationとStatusCodeが設定されるだけ •  Routeは後に追加されたものから評価される •  APIを実装するときは – app->useImplicitView(false) もしくは、 response->setContent($content) したものを明 ⽰示的に return する
  21. 21. モデルで気をつけるべきこと •  useDynamicUpdate, keepSnapshots は true にすべし –  Updateクエリに全てのフィールドが⼊入っている •  1アクセス内での2回⽬目の save/update は気をつけろ –  snapshot は、SELECTのタイミングでしか⼊入ってない •  save/update/delete の返り値はちゃんと確認すべし –  model->getMessages() もしくは、transaction->getMessages() に エラーが⼊入っている •  データベースからデータ取得は⽂文字列列 –  これはPDOの仕様に基づくもの PDO::ATTR_STRINGIFY_FETCHES => false, PDO::ATTR_EMURATE_PREPARES => false など適切切に 設定する必要がある •  厳密なデータの影響件数は $connection->affectedRows()
  22. 22. 502 Bad Gateway 多くの場合 Volt テンプレート内での問題が原因 •  テンプレートのパースが正常にできなかった – ある程度度はパースエラーが出る •  Null⽂文字列列を扱えない関数へNullを渡した – 本来、Fatal Error としてエラーが出るがテンプ レート上で発⽣生すると  Core dump して死ぬ テンプレートへのNullは排除すべし
  23. 23. 学習コストについて •  ドキュメントが英語だから分からん → サンプルコードから読み解くべし •  フレームワークのソースがC⾔言語だから分からん → ⾷食わず嫌いはよくありません、まずは⾒見見てみましょう → C⾔言語知らない⾃自分でも、なんとなく意図は読めた → 有志でPHPの実装してる⼈人がいるので⾒見見⽐比べてると 慣れてくる  https://github.com/scento/phalcon-php •  core dumpした!! → 多くの場合において渡している引数やその値に問題が 多いです、実装を読みつつ、呼び出し⽅方法などで 回避できることが多いです
  24. 24. 社内への普及について Phalconは⾃自由度度の⾼高い フレームワーク まずは社内⽤用のスケルトンを 作ることをお勧めします 実際、スケルトン作ったら 普及が加速した気がします
  25. 25. 社内向けスケルトンについて phalcon-devtoolsも良良いですけど 弊社では composer create-project create-project のスケルトン作成については 本題から話しが逸れるので割愛しますが… オススメです
  26. 26. ご清聴ありがとうございました Phalcon + AWS で仕事をしたい エンジニア募集中 http://www.sonicmoov.com/recruit/

×