受託開発のPhalcon
Phalconでつくるwebアプリケーションのハマりどころ
2014年08月05日(火)
株式会社ソニックムーブ 平岡 雅俊
https://www.facebook.com/masatoshi.hiraoka.16
おしながき
• 自己紹介
• Phalconについて
• Phalconでの開発実績
• 開発中にハマったあれこれ
• あとがき
自己紹介
基本情報 平岡 雅俊 28歳 独身
IT歴 9年くらい
PHP歴 5年くらい
趣味 スノーボード
生息地 千葉県浦安市
好きな食べ物 オムライス
嫌いな食べ物 ホルモン
株式会社ソニックムーブ(http://www.sonicmoov.com)
に入社してはや3年目。
入社当初はソーシャルゲーム開発をSymfony1系で、ソ
リューション事業部に移動してからはWordPressや
PhalconなどのFWを用いてシステム開発を行う。
インフラがちょっと苦手。
似顔絵アイコンは弊社デザイナーにお願いして書いてもらい
ました!似てると評判。本人はちょっと複雑。
Phalconについて
• C拡張で実装された爆速PHPフレームワーク
• 拡張性が高いので、結構自由な構成で開発できる
• DIコンテナ、Event Dispatcherなどで汎用性が高い
• 謹製テンプレート言語 “Volt”
• 公式ドキュメントがしっかりしている(英語だけど)
• ドキュメントの日本語化もすすんでます!(サボっててすみません_ノ乙(、ン、)_)
• incubator や phalcon eye などのサンプルソースが豊富
• FW自体の開発もどんどん進んでます(Zephir)
http://blog.phalconphp.com/post/57161129440/phalcon-2-0-
the-future
• Vagrant にも対応
http://phalconphp.com/en/download/vagrant
Phalconでの開発実績
FUN!FUN!DASHMAN!
株式会社JIN様との共同制作。サーバー資源の効率化を目
的として、バックエンドにPhalconを採用。
※現在はサービス終了のため、アクセスできません。
Guile
弊社が提供する第三者配信型の動画広告ソリューション。
当サービスの管理画面構築にPhalconを採用。
ACLを利用したアカウント管理などを目下実装中。
http://guile.jp/
開発中にハマったあれこれ
502 Bad Gateway
ページを表示しようとすると、“502 Bad Gateway”が発生。
事象発生初期では、別チームからVoltのテンプレートでエスケープ処理
を多様すると起こるとの情報があったが、Viewの処理直前で強制的に中
断させても起き続けた。 php-fpm が吐き出す core dump ファイルを解
析するも、原因が分からず。。
調べるなかで、どうやら pagination まわりが怪しいことが判明。
そこで、“全知全能の神”とか“先生”とか呼ばれている、とある友人に聞
いてみました!
環境
• nginx 1.4.7
• php + php-fpm 5.4.22
• Phalcon 1.2.4
• Mysql 5.6.17
その
結果
解決した
さすが全知全能の神、Google先生ステキです!
要はPhalconのバグでした。
バージョンアップでサクっと解決。
Phalconに限った話じゃないですが、バグ報告などの情報はこまめにチェックし
ないとダメですね。。
Github等でissueのやりとりが頻繁に行われているので、参考にしたり報告したり
してコミュニティの活動に参加するのも良いと思います!
参考
https://github.com/phalcon/cphalcon/issues/1385
が、
Pagination + group by
502 Bad Gatewayにならなくなって小躍りしていたところに新たな問題。
pagination を使ったページング処理中に group by を絡めた場合、なに
やら結果セットの様子がおかしい。。
早速、友人に聞いてみると、以下回答が返ってきた。
https://github.com/phalcon/cphalcon/issues/2065
どうやらこれもバグらしい。※2014年8月現在では修正されている模様(FBが早いのもイ
イ!)
内容としては、paginationが返す結果セット数がgroup byによってグ
ルーピングされる以前の数字なっているというもの。
仕方がないので、paginationのオブジェクトをちょっと拡張、ついでに
behaviorっぽくしてみた。
PaginationTrait.php
Pagination の各プロパティを計算して再セット
Trait として Model の振る舞い(behavior)を定義
Products.php
idでグルーピング
生成した Paginator オブジェクトを操作
PaginationTrait を利用したページネーションの実装例
QueryBuilder + Join
Phalcon では QueryBuilder を使ってSQLを構築したりできます。
ただ、このドキュメントを見てそのまま利用しようとすると、Model が見つ
からない旨のエラーメッセージが表示されます。
Join 等でモデルを指定する時は必ず Namespace 込みのフルパス
(?)で指定する必要があります。
例えば Namespace が Sonicmoov であれば次のようになります。
正直、incubator や 公式以外のサンプルソースを見れば、すぐ分かる問
題なんですが、自分はハマりました。。30分くらいハマりました。。
ちなみに Model の指定時にaliasを設定することによって、任意の名前
で呼び出すこともできます。
headerが出力されない
参考
https://github.com/phalcon/cphalcon/issues/2539
Locationヘッダーを出力して終了したつもりでも、flushしないと出力され
ない問題。
ココにflush()を入れる
Validation + StringLength + UTF-8
参考
https://github.com/phalcon/cphalcon/issues/971
PhalconのStringLengthValidationでは、mbstringモジュールが有効な
場合は内部的にmb_strlen()を利用するように書かれています。
が、mb_internal_encoding(“utf-8”);を指定しないと、文字数カウントがう
まくいかず、正常なバリデーション結果が得られません。
その他
他にも色々とハマりましたが、全体的に Model の実装周りでつまづいた
ことが多かったように思います。
元々 Symfony を使っていて、Propel に慣れていたせいもあってか、「で
きるだろう」と思ったことができなかったり、やり方を見つけるまでに時間
がかかりました。。
確かに公式マニュアルは充実していますが、要所々をかいつまんだ説
明になっていることも多く、Cの実装部分を覗いたり、他に同じことを実装
しているソースコードを読んだりして、気づく点が多かったと思います。
そういった意味でも、これからどんどん Phalcon ユーザーが増えて、自
分の為これから Phalcon を始めよう!って人の為に情報を共有してもら
えると良いかと思います!
※あと公式マニュアルの翻訳ガンバります _ノ乙(、ン、)_
あとがき
Phalconを使ってみて
• 学習コスト
• 構成の自由度
• デフォルトで搭載されている機能
• パフォーマンス
最後に
株式会社ソニックムーブでは、新技術が大好物な
Webエンジニアを募集しております!
Phalcon に限らず、AWS や Docker などのインフラでも、新技術に対して
前向きな会社で働きたい人は、是非お声がけ下さい!
http://www.sonicmoov.com/recruit/system-engineer/
詳しくはこちら!
ご清聴ありがとうございました!

受託開発のPhalcon