MTタグが1000個以上記述してあるテンプレートはそれだけで再構築以前の処理に時間を食う
公開日 : 2016-02-17 17:00:29
この記事は、「やはりお前らのMTMLは間違っている」シリーズ連載第n回目の連載です。
MTタグが数千、下記の例では7500個書いてあるテンプレートの話しです。
<mt:SetVar name="master_table" key="12000" value="JR山手線">
<mt:SetVar name="master_table" key="19200" value="東京メトロ千代田線">
....同じような記述が7500個くらい記述が続く
DB接続するようなMTタグが一切無いにも関わらず、再構築に数十秒かかります(手元環境では30秒から45秒)。MTSpeenMeterタグを使うとビルドにかかっているのはたかだか3〜4秒。
であれば、ビルドに入る前段階で時間を食っていると考えるのが自然。
時間がかかっているのは MT::Builder の sub compile{}です。要するに正規表現でMTタグをパースする処理。MTタグが多ければ多いほどここに時間がかかります。
要するに、PHPでも以下紹介した事象がスタティックでも発生するということです。しかもPerl、スタティックのパース結果はキャッシュされない(同一リクエスト内ではキャッシュされる模様)。
対策は、MTSetVars、MTSetHashVarsを使うか、素直にデータベースを使う
MTタグの数が少なければパース時間は短くなるため、MTSetVars、MTSetHashVarsを使って纏めて記載する。
https://github.com/alfasado/mt-plugin-get-hash-var
<mtSetHashVars name="master_table"> 12000=JR山手線 19200=東京メトロ千代田線 ...7500個分 </mtSetHashVars>
でも、この手のデータだったらカスタムオブジェクトでも何でも良いけど素直にデータベース管理が良いと思います。