【最速PHPフレームワーク】Phalconを実案件で使った感想
- カテゴリ :
- バックエンド(プログラミング)
- タグ :
- PHP
- Phalcon
こんにちは。宇都宮です。
最近は、「最速PHPフレームワーク」Phalconで開発を行っています。
Phalconは、PHP拡張として実装された、フルスタックのPHPフレームワークです。非常に高速に動作するという特徴がありますが、特有の難しさもあります。
そこで、実際に開発を行って感じたPhalconの特徴を、Q&A方式で紹介していきます。
Phalcon公式ベンチマークからも読み取れるように、Phalconは一般のPHPフレームワークを大きく上回る実行速度を持っています(req/secで2倍〜7倍程度)。
また、Phalconの提供している機能を積極的に利用することで、パフォーマンスの最適化を図ることができます。たとえば、Phalconのモデルが提供するORマッパーはCで実装されており、高速かつ省メモリです。
Phalconの各コンポーネントは、比較的シンプルに作られています。一般的なMVC構造のWebアプリケーションフレームワークを使用したことがある人なら、それほど違和感なく使い始められるでしょう。
ただ、他のフレームワークに比べ、情報源が限られている印象があります。
主な情報源はPhalconの公式ドキュメントで、必要な情報はだいたい載っています。一方、Phalcon公式ドキュメント以外の情報源は、ほとんどありません。
また、現状では、Phalconの情報はほとんど英語しかありません。ドキュメントの日本語訳は少しずつ進んでいますし、Qiitaやブログ等でも日本語の情報はみかけますが、現時点でPhalconでの開発を行うには、英語のドキュメントを読んでいく必要があります。
PHPで実装されたライブラリであれば、ライブラリ内部のエラーはPHPがエラーとして出力してくれます。これに対して、PHP拡張の内部にエラーがある場合、PHPは実行を停止します。このとき、サーバのエラーログを見ると、「zend_mm_heap corrupted」とか「Segmentation fault」といった文言が出力されているはずです。
こういったPHP拡張内部のエラーは、原因の究明が難しく、回避もしづらいという特徴があります。
では、Phalconを使って開発しているとき、こういったエラーに遭遇する機会はあるのでしょうか? 残念ながら、ゼロではありません。週に1回くらいは、これらのエラーに遭遇する機会があります。
経験上、Segmentation faultは自分のコードに起因していることが多いです(必須引数の渡し忘れ等。本来なら、フレームワークがエラーを返してしかるべきパターンですが…)。
それに対して、zend_mm_heap corruptedは、予期しないタイミングで発生します。Phalconが提供しているオブジェクトのプロパティ操作に起因して起こるという共通点がありますが、プロパティを触れば必ず発生するわけではなく、読みづらいエラーです。
Phalconのバージョン1はC言語で実装されていますが、バージョン2はZephirという言語で書き直されています。
Zephirは、PHP拡張を書くためのDSL(ドメイン特化言語)です。Zephirとは、Zend Engine/PHP/Intermediateの略称です。Zephirにはポインタがないので、C言語で実装するのに比べ、メモリ管理の不備に起因するエラーを低減させることができます。
ZephirはPHPにとても良く似たシンタックスで、PHPの標準関数もそのまま利用できます。Zephirのコードは、PHPを書くのに近い感覚で書いていくことができます。
Phalconのバージョン2系では、Zephirの導入により、安定性の向上とフレームワーク本体の開発効率向上が期待されています。
なお、v2.0.0は実装言語の置換えを目的としたバージョンなので、v1.3.xで動作するように実装されたアプリケーションは、v2.0.0でも問題なく動作します。
一般的なPHPフレームワークに比べ、Phalconは構成の自由度が高いです。Phalconには3種類の構成が用意されており、Slim/Silexのようなマイクロフレームワークとしても使えますし、シングル・マルチモジュールのMVCアプリケーションにも使えます。
また、強力で使いやすいDIコンテナや、豊富なイベントを備えているため、フレームワークによる縛りのせいで、やりたいことができない、ということはほとんどありません。
Phalconはフルスタックフレームワークなので、一般的なWebアプリケーションに必要となる機能はほとんど揃っています。ただ、「機能としてはあるのだけど、微妙に行き届いていない」機能がちらほらあります。
例えば、Phalconには、RDBのテーブルの情報を元に、モデルクラスを自動生成する機能があります(Phalcon DevTools の phalcon modelコマンド)。この機能は、テーブル定義を元にプロパティを定義したり、getter/setterを生成したりといった作業を自動で行ってくれます。
しかし、外部キー制約を元にしてリレーションを読み取り、リレーションを定義するコードを生成する機能はありません。hasOne/hasMany/belongsTo/hasManyToManyといったリレーションの定義コードは、自分で書く必要があります。
Phalconは、PHP拡張という点では「とんがった」フレームワークですが、実際に利用してみると、意外とオーソドックスです。シンプルで高速に動作するフレームワークが好きな方には、特にオススメです。
最近は、「最速PHPフレームワーク」Phalconで開発を行っています。
Phalconは、PHP拡張として実装された、フルスタックのPHPフレームワークです。非常に高速に動作するという特徴がありますが、特有の難しさもあります。
そこで、実際に開発を行って感じたPhalconの特徴を、Q&A方式で紹介していきます。
Q. Phalconを使うと、高パフォーマンスのアプリが作れるの?
A. フレームワークの遅さに足を引っ張られることはなくなる
Phalcon公式ベンチマークからも読み取れるように、Phalconは一般のPHPフレームワークを大きく上回る実行速度を持っています(req/secで2倍〜7倍程度)。
また、Phalconの提供している機能を積極的に利用することで、パフォーマンスの最適化を図ることができます。たとえば、Phalconのモデルが提供するORマッパーはCで実装されており、高速かつ省メモリです。
Q. Phalconの学習コストは?
A. フレームワーク自体は難しくないが、英語の壁はある
Phalconの各コンポーネントは、比較的シンプルに作られています。一般的なMVC構造のWebアプリケーションフレームワークを使用したことがある人なら、それほど違和感なく使い始められるでしょう。
ただ、他のフレームワークに比べ、情報源が限られている印象があります。
主な情報源はPhalconの公式ドキュメントで、必要な情報はだいたい載っています。一方、Phalcon公式ドキュメント以外の情報源は、ほとんどありません。
また、現状では、Phalconの情報はほとんど英語しかありません。ドキュメントの日本語訳は少しずつ進んでいますし、Qiitaやブログ等でも日本語の情報はみかけますが、現時点でPhalconでの開発を行うには、英語のドキュメントを読んでいく必要があります。
Q. Phalconの安定性は?
A. おおむね安定しているが、完璧ではない
PHPで実装されたライブラリであれば、ライブラリ内部のエラーはPHPがエラーとして出力してくれます。これに対して、PHP拡張の内部にエラーがある場合、PHPは実行を停止します。このとき、サーバのエラーログを見ると、「zend_mm_heap corrupted」とか「Segmentation fault」といった文言が出力されているはずです。
こういったPHP拡張内部のエラーは、原因の究明が難しく、回避もしづらいという特徴があります。
では、Phalconを使って開発しているとき、こういったエラーに遭遇する機会はあるのでしょうか? 残念ながら、ゼロではありません。週に1回くらいは、これらのエラーに遭遇する機会があります。
経験上、Segmentation faultは自分のコードに起因していることが多いです(必須引数の渡し忘れ等。本来なら、フレームワークがエラーを返してしかるべきパターンですが…)。
それに対して、zend_mm_heap corruptedは、予期しないタイミングで発生します。Phalconが提供しているオブジェクトのプロパティ操作に起因して起こるという共通点がありますが、プロパティを触れば必ず発生するわけではなく、読みづらいエラーです。
Q. Phalconの開発状況は?
A. 現時点の最新安定版はv1.3.1。次期メジャーバージョンのv2.0.0がβ版の状態
Phalconのバージョン1はC言語で実装されていますが、バージョン2はZephirという言語で書き直されています。
Zephirは、PHP拡張を書くためのDSL(ドメイン特化言語)です。Zephirとは、Zend Engine/PHP/Intermediateの略称です。Zephirにはポインタがないので、C言語で実装するのに比べ、メモリ管理の不備に起因するエラーを低減させることができます。
ZephirはPHPにとても良く似たシンタックスで、PHPの標準関数もそのまま利用できます。Zephirのコードは、PHPを書くのに近い感覚で書いていくことができます。
Phalconのバージョン2系では、Zephirの導入により、安定性の向上とフレームワーク本体の開発効率向上が期待されています。
なお、v2.0.0は実装言語の置換えを目的としたバージョンなので、v1.3.xで動作するように実装されたアプリケーションは、v2.0.0でも問題なく動作します。
Q. Phalcon、速度以外の利点はあるの?
A. 柔軟で、自由度が高い
一般的なPHPフレームワークに比べ、Phalconは構成の自由度が高いです。Phalconには3種類の構成が用意されており、Slim/Silexのようなマイクロフレームワークとしても使えますし、シングル・マルチモジュールのMVCアプリケーションにも使えます。
また、強力で使いやすいDIコンテナや、豊富なイベントを備えているため、フレームワークによる縛りのせいで、やりたいことができない、ということはほとんどありません。
Q. Phalconへの不満は?
A. かゆいところに手が届かない
Phalconはフルスタックフレームワークなので、一般的なWebアプリケーションに必要となる機能はほとんど揃っています。ただ、「機能としてはあるのだけど、微妙に行き届いていない」機能がちらほらあります。
例えば、Phalconには、RDBのテーブルの情報を元に、モデルクラスを自動生成する機能があります(Phalcon DevTools の phalcon modelコマンド)。この機能は、テーブル定義を元にプロパティを定義したり、getter/setterを生成したりといった作業を自動で行ってくれます。
しかし、外部キー制約を元にしてリレーションを読み取り、リレーションを定義するコードを生成する機能はありません。hasOne/hasMany/belongsTo/hasManyToManyといったリレーションの定義コードは、自分で書く必要があります。
まとめ
Phalconは、PHP拡張という点では「とんがった」フレームワークですが、実際に利用してみると、意外とオーソドックスです。シンプルで高速に動作するフレームワークが好きな方には、特にオススメです。