MTCollateの落とし穴

先日、MTCollateのススメと題して、便利なプラグイン MTCollate の紹介をしました。

その後も私は愛用してきたのですが、その中で、重大な問題点を発見しました。
特に日本語環境でこのプラグインをお使いの方は、十分に注意が必要な、かなり危険な問題点です。
その問題点とは、簡単にまとめるとこうなります:

『セットしたフィールドに日本語(マルチバイト文字)が含まれる場合、そのフィールドをソートキーにすると、再構築時にサーバに過負荷がかかる場合があり、最悪の場合サーバがダウンする』
(WindowsXP+Apache2.0.x+Perl5.8.7+MT3.33-ja+MTCollate1.1 で確認)

再現例

例えば、以下のような例を見てみます。

<MTCollateCollect>
  <MTEntries days="365">
    <MTCollateRecord>
      <MTCollateSetField name="Date"><$MTEntryDate format="%Y/%m/%d"$></MTCollateSetField>
      <MTCollateSetField name="Title"><$MTEntryTitle$></MTCollateSetField>
    </MTCollateRecord>
  </MTEntries>
</MTCollateCollect>
<MTCollateList sort="Date:- Title:+">
  <MTCollateField name="Date">: <MTCollateField name="Title"><br/>
</MTCollateList>

過去365日間のエントリーを抜き出して、日付とタイトルでソートして表示する、というサンプルです。
<MTCollateList>の sort 属性で "Date:- Title:+" としているので、日付の降順(新しい順)、タイトルの昇順(アルファベットからの辞書式順序)でソートする、という指定です。
ごくごく一般的な使い方のように見えます。
そしてこれが問題なく再構築できる場合もあります。
しかしタイトルに日本語が使われていた場合、サーバに過負荷がかかり反応しなくなることがあります。
(実験は自己責任でお願いします。特にレンタルサーバ・共用サーバをご使用の方は、危険ですので真似しないようにしてください。)
なお、日本語を含む場合でも問題なく再構築できる場合もあるようです。

原因として考えられること

まだはっきりとしたことは分かっていません。
現象として、以下を確認しています:

  • 再構築時にCPUの使用率はさほど上がらない
  • 再構築時にメモリの使用量が跳ね上がる。
    →perlプロセスのメモリ使用量が増大している模様(メモリリーク発生?)

おそらく日本語等のマルチバイト文字の処理を意識しないコーディングをしていることから来ている現象であろうことは考えられます。
もし詳細が分かりましたら追記したいと思います。

対策

根本的な対策は、今のところありません。
ソートをする場合には、当分はキーとなるフィールドの値に日本語が入らないように気をつけるしかないでしょう。
ただ、重複を取り除く"d"オプションを使用するのなら、半角英数記号文字だけからなる別のフィールドを代わりに使用すればよいでしょう。
例:カテゴリーラベル(<$MTCategoryLabel$>)の代わりに、カテゴリーファイル名(<$MTCategoryBasename$> ※MT3.3x以降)やカテゴリーID(<$MTCategoryID$>)を使用する、など。

トラックバックURL

このエントリーのトラックバックURL:
http://www.antimon2.atnifty.com/mt/mt-tb.cgi/36

コメントする