【cakePHP】LazyModelを使って最適化を図る
cakePHP LazyModel導入
LazyModelの導入はとても簡単です。 もし、CakePHPを使っていて、最適化を考え、30分でも時間がある場合は導入してみる価値があると思います。
cakePHPで開発を行う場合、中規模開発になってくるとmodelが多くなっていくと思います。 その時
var $uses = array('Recipe', 'User');
この様な形で呼び出すと思いますが、CakePHP1.3では各functionを読んだ時に$usesに定義された不要なmodelまで読み込んでしまいます。 CakePHP2.x系では解消され、各functionに必要なmodelのみの読み込みを行います。
ということは各functionで必要なmodelだけを呼べばいいんじゃない?っていうことで
public function hoge(){ $this->loadModel('Recipe'); ... }
こんな形で各functionで読んだりしてました。
ただこの形だとfunctionが増える度に、都度loadModelしないといけないわけで。 コード量は増えるわ、手間かかるわで。。。
ということでLazyModelというものを導入しました。
このLazyModelはチェインローディングを最適化してくれる素敵なプラグインです。
ただし、上記にもあるようにmodel数が増える中規模開発から大きな威力を発揮します。
cakePHPにもこんな記述があります。
あなたがPHP5を実行している場合、これは何が必要です。 このLazyModelは、モデルの読み込みを最適化します。 これは、実際に使用されているものだけにロードされたモデルの数を制限します。 これを使用するときは、速度を向上させることができますし、大幅にメモリ使用量を減少させます。 あなたはビルドすべてのプロジェクトでLazyModelを使用する必要があります。 それはわずか10秒などかかるプロジェクトにこれを追加するが、 なるようにと〜時期尚早optimization’â€呼ばれるかもしれないが これを見て簡単であり、時間のほとんどを支払うことになる、と述べた。
まんま日本語訳、文字化け混じりで説明ありがとうございます。
ということで早速導入です。
githubのREADME.mdを見ればわかることですが。
上記の"Frank de Graaf’s Lazy Model"からcloneしてくるかよくわからないって人はDownload ZipでDLしてFTPなりでアップしてください。
該当のファイル構成は以下の通り
│ README │ ├─libs │ lazy_model.php │ └─tests │ lazy_models.php │ └─cases └─libs lazy_model.test.php
上記のような形になっています。
ディレクトリそのままapp/pluginsに突っ込んでも良かったのですが とりあえずファイルだけあればいいやと思ったのでlibsをそのままapp/pluginsに入れました。
次にapp/app_model.phpを編集します。
App::import('Libs', 'LazyModel.LazyModel'); class AppModel extends LazyModel { ... }
LazyModelをApp::importで呼び出してextendsします。
たったこれだけです。
色んなサイトを参考に調べましたが、環境によりけりだとは思いますが $usesの配列にモデル名を加えていくと、一つにつき、4-6%表示時間が多くかかるみたいです。 こういったものを少しでも減らして、ただでさえ重い、メモリ喰いCakePHPを最適化できるといいですね。