DynamicMTMLの初期化を軽量化する。
公開日 : 2012-02-03 15:50:26
藤本さんが書かれていたのでDynamicMTMLに絞って初期化の軽量化について書きます。
真新しいMacBook Air(13インチモデル 1.8GHz Intel Core i7 メモリ4GB 1333 MHz DDR3)上のMAMP2.0.5、PHP Version 5.3.6+MySQL5.5.9で計測しました。
計測はDynamicMTML、PowerCMSを突っ込んだ状態でSmart Blogテーマのトプページで計測します。まずは素の状態で計測(単なるPHPファイル)。
...数字に差がない...ときどき0.0001くらいの数値が出ます。ということで仮に0.0001秒としましょう(速いよMBA)。
前提条件
さてここからいよいよ計測していくわけですが、まず、DynamicMTMLはファイルキャッシュのしくみを持っていて、キャッシュが使える状況であればそれを使えということになります(管理画面でチェックボックスにチェック入れるだけです)。今回は当然ですが、それが使えない場合の軽量化、がテーマです。尚、条件付きGETの有効チェックボックスは必要に応じて入れると良いと思います。
条件付きGETってなに?という方はこちらを。
DynamicMTMLの初期化の流れ
DynamicMTML及びMTのダイナミックの初期化の流れを以下におおまかに書きます。
- mt-config.cgiの設定値などを読み込む
- ダイナミックパブリッシングのライブラリ(mt/php以下のファイル群)、プラグイン、addons以下のphpライブラリをスキャンする。
- この時、グローバルモディファイア等を登録する
- 各プラグインのphpディレクトリ以下の init.foo.php があればこれを実行する。
- DB接続して、設定値等を読み込み、ブログをロードする
- ファイルパスからmt_fileinfoレコードを取得して、どのアーカイブかを判断、エントリー等をロードしてコンテクストをセットする
- テンプレートをビルドする
正確には上記の処理の各所でコールバックが呼ばれ、コールバックプラグインが登録されていればそいつが処理されます。
さて、「ダイナミックパブリッシングのライブラリ(mt/php以下のファイル群)、プラグイン、addons以下のphpライブラリをスキャンする。」ってさりげなく書きましたけど、mt_dir_以下のphp/libディレクト以下のphpファイルいくつありますか? 500以上ありますね。PowerCMSやプラグインやDynamicMTMLも...あわせると1000超えますよね。つまり、初期化の際にこれらすべてスキャンして、init.foo.phpがないか、modifier.foo.phpがないか調べてます。実際は微々たる時間ですけどね。ただ、この辺はeAcceleratorなんかを使うことで多少は改善されます。
また、init.foo.phpの件については、例えば Commercial.pack/php/init.CustomFields.php は何をしているかというと、DBに登録されているカスタムフィールドをロードして、タグ名をsmartyに動的に登録しています(つまりSQLのクエリが投げられてんですね)。カスタムフィールドのタグからの出力をダイナミックに行わない場合、こいつは要らないことになります。他にMultiBlog/php/init.MultiBlog.phpなんかもタグ登録系です。
また「ブログのロード」「mt_fileinfoレコードを取得」ってありますが、例えば携帯、スマホ分岐のみにDynamicMTMLを使っている場合、DB要らないですよね。これ、実はDB接続なしでDynamicMTMLを実行する方法があります。ドキュメントルート以下に生成されている .mtview.phpの先頭付近
$blog_id = 1; // 1はブログ/ウェブサイトのID
こいつをコメントアウトすると、DBの初期化をスキップして処理を続行するんですね。
ここら辺から、以下の施策によって初期化の軽量化を図ることにします。
- eAcceleratorやXcacheを有効にする
- プラグインの数を減らす
- DB接続しない
以下、DynamicMTML利用時の各計測結果(10回計測した平均値です)。実際の効果についてはサーバーやDBの状態、運用しているサイトによって違うと思いますし、必要に応じてこういうアプローチがとれる、という程度の参考にしてください。
デフォルトの状態
0.001767516
※気になるってほどの時間じゃないですけどね...続けます。
Xcacheを有効にした状態で計測
0.001712704
Xcacheの代わりにeAccelerator(以下、eAccelerator有効で継続)
追記:あまり効果が出ていないように見えるのはSSDのため。HDD環境では高速化が期待できます
0.001612711
標準以外のプラグインなし
0.000941825
各プラグインディレクトリ以下のphp/init.foo.phpのみ削除
0.000869989
プラグイン(addon)なし
0.000636888
blog_id指定なし
0.000617242