旅するえんじにあ - Engineers to Travel -

旅するエンジニアの気まま備忘録

【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というものを導入しました。

"Frank de Graaf’s Lazy Model"

このLazyModelはチェインローディングを最適化してくれる素敵なプラグインです。

ただし、上記にもあるようにmodel数が増える中規模開発から大きな威力を発揮します。

cakePHPにもこんな記述があります。

"LazyModelの最適化モデルの読み込み"

あなたが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を最適化できるといいですね。