2016年1月から約半年 Phalcon を使ってみた感想

By: yunguyen666

PHP のフレームワークの中でも高速と言われている「Phalcon」の2系を2016年1月より、半年ほど使ってみました。
いったいどんなものなのか? CakePHP や Yii2 などと比べてどうなのか、という所感を述べてみます。

第一印象は「テンションが低い」

PHPのエクステンションを設置するだけで使えるという手軽さ、とは言われていますが、格安レンタルサーバでは導入が難しいからか、今いち、日本では盛り上がりに欠けている、という印象です。

そもそも、新プロジェクトで Phalcon が採用になったのも、その選択方法に疑問を感じるところがありました。
PHPのフレームワークでも「最速」という記事をかじった、発注元の「組み込み系」のメンバー方の判断でした。

本当に大丈夫なの? という印象です。

しかも、公式サイトはマニュアルの半分くらいまでしか日本語化が進んでいません。
多少、英語マニュアルに通じている方なら、優しい英語なので大体読み解けますが、英語アレルギーの方には厳しい状況です。
もちろん、大手出版社の書籍は、2016年6月にいたるまで、1冊も出ていません。

PHPの中でも最速のフレームワーク? …確かに速いです。

これは、使っているうちに実感できてきたのですが、ローカルや、無償枠の Heroku 上で使ってみても、なかなか速いと感じられました。

実際に計測された方の記事はこちら(「Phalconの何がいいのか速いのかに疑問を持ってみる」)。

例えばですが、何でもかんでも JS にしてしまう WebPack 、あれを使うより、高速にレンダリングしてくれているのではと思います。

WebPack の欠点は、何もかも詰め込んだJSが読み終わるまで、画面が固まることです。
Googleは、「ブロッキングJS」と呼んで、サイトの評価を下げるポイントとしています。

ライブラリをひとつにしてリクエスト数をおさえるのは確かにメリットがありますが、それもサイズを考慮しないといけないと思います。
その点、Phalconのレンダリング・スピードはなかなかのものでした。

AngularJS を知った時は、これからはフロントサイドの時代かなと思いましたが、サーバサイドもまだまだ捨てたものじゃない、とう印象です。

Phalcon の「方言」

実際、フレームワークを使ったことのある方なら分かる話なのですが、そもそもフレームワークでは、「プログラムの理解度」より、独特の「使い方を知る」ことが重要になってきます。

セキュリティや、難しいSQLを簡単にしてくれるツールですが、フレームワーク独自の使い方になっているため、たとえPHPのすべてを理解していても、そのフレームワークのことを何も知らなければ、何にもできません。

電子機器に詳しい人がいても、全長20mの工業用モンスタートラクターを運転するなら、その使い方は、一から学ばないといけないのと同じです。
もちろん、電子機器に詳しければ、何かトラブルがあった時に、細かいところに手を突っ込んで直したりもできるわけですが、そのフレームワークがどう動くのかは、別の知識、テクニックが必要になってくるわけです。

Phalcon が他のフレームワークと異なるのは、「DIコンテナ」とか、「依存性コンテナ」と呼ばれるものと、公開用ディレクトリの直下にある、「bootstrap」ファイルと呼ばれるものです(もちろん、Twitter の Bootstap のことではありません)。

DI という変数に使いたいクラスを宣言して入れておくと、フレームワーク内のどこでも使えるようになります。
考え方は、composer の autoload.php と同じです。
ただ、組み込み済みのクラスがいくつかあり、セッションとか、ログとか、APIを作るときのレスポンスとかはあらかじめ備わっています。
もちろん、composer と合わせて使うこともできます。

PostgreSQL が…使えない?

PHP のフレームワークと相性が良いのは、MySQL です。Oracle になると、CakePHP や Yii では使えないことが多いです。

PostgreSQL を Phalcon で使ってみたところ、2つのテーブルを結合して、IDで紐づいた先の名前を出力したら、みんな最初の名前になるという、とんでもないバグがありました。

仕方ないので、Idiorm というPDOをラッピングしたライブラリを使用していますが、うまくいっています。
柔軟性があると言われている Phalcon 、モデルの代替も柔軟にできてしまうので、救われました。

便利なプラグインはほとんどない…まったくないわけではない

CakePHP に比べると、ヘルパーの数も少なく、プラグインも見つかりません。ほとんどないと思われますが、たまに「デバッグツールバー」などが見つかります。最後に実行したSQLを出力してくれたり、リクエスト変数をすべて展開してくれたりと便利です。

半年使ってみて。気に入っていますが、人にはすすめにくいフレームワークです。

サーバによって、インストールできないことが多いであろう、Phalcon ですが、高速であることと、モデルやビューを簡単に好みのものに入れかえることができるので、海外では人気が高いようです。
Google App Engine のフォーラムでは、Phalcon をサービスとして組み込んでもらうよう、票を集めているのを見かけました。

マニュアルや記事が少ないので、とっかかりが大変ですが、さすがに実プロジェクトで半年もさわっていいると慣れてきました。

動作が速く、「かゆいところにデフォルトでは手が届かないが、結構何とかなる」仕様は、意外と良いものです。
何ともならず、「独特の解決方法」を何時間もかけて探す、というようなことはあまりありませんでした(英語が読めれば…)。

私個人は、Rails から CakePHP、Yii2、そして Phalcon へと流れてきたのですが、今は Phalcon がお気に入りです。
まったく、Google App Engine で使えたらいいな、と思います。
フレームワークはどうやって動いているのかよく分からない(特にYii)のですが、Pahlcon は理解しやすいと思います。

ただ、困ったときに、つくづく英語が重要になってくるフレームワークです。それでもYiiよりはわかりやすい印象を受けました。ウェブ開発するならドキュメントのやさしい英語くらい読破したいものですが、どうしても苦手な人には難しいでしょう。
開発者全員には薦めにくいフレームワークですが、高速であること、柔軟性があることは大きな利点です。

データベースがMySQLで、サーバがいじれて、ちょっと高速を競いたい案件があるなら、おすすめです。

Phalcon セッション管理まとめ

public/index.php

use Phalcon\Session\Adapter\Files as Session;
 
// 依存性コンテナへの登録
$di->setShared('session', function () {
    $session = new Session();
    $session->start();
    return $session;
});

各コントローラで

// セッションに値をセットする
$this->session->set("USER_NAME", "AKIRA");
 
// セッションから値を取得する
$this->session->get("USER_NAME");
 
// セッションがセットされているか確認する
if ($this->session->has("USER_NAME") ) {
}
 
// セッションを個別で破棄する
$this->session->remove("USER_NAME");
 
// セッションをすべて破棄する
$this->session->destroy();

連想配列の場合。その一部の更新方法

$this->session->set("hoge", [
    "one" => 1,
    "two" => 2,
    "three" => 3
    ]
);
 
$array = $this->session->get("hoge");
 
$array["three"] = 4;
 
$this->session->set("hoge", $array);