「Help:テンプレートの制限」の版間の差分

ノートでの指摘などを踏まえて若干の修正
(若干の修正)
(ノートでの指摘などを踏まえて若干の修正)
メディアウィキでは、ウィキテキスト(ウィキソース)をもとに[[HTML]]ページが生成されますが、読み込みデータについては[[構文解析]]の一種([[再帰下降構文解析]])を使用しています。ウィキテキストは「[[プリプロセッサ]]」を用いて「ツリー」と呼ばれるデータ構造に変換され、このツリーを用いてHTMLソースが生成されます。
 
構文解析の過程では、生成されるページの複雑性を把握するためにいくつかのカウンターが使用されます。カウンターは解析開始時点でゼロに設定され、解析中に該当するプロセスがあると数値が計上されていきます。カウンターには上限値が設定されており、上限値を越えるとテンプレートの展開や関数の動作できなくなり停止されます。
 
極端に長いページや[[Help:テンプレート|テンプレート]]をたくさん呼び出しているような複雑なページは解析に時間がかかります。このことは利用者にとって不便なだけでなく、処理不可能なほど巨大なデータをメディアウィキに解析させることで[[DoS攻撃]]の手段として悪用される可能性もあります。このような攻撃を予防し、ページの読み込みが常識的なスピードで行われることを保証するために、このような制限が設定されています。読み込みデータの制限は、2006年8月より導入されました。2008年2月から新しいプリプロセッサが導入され、制限の方法が変更されました([[meta:Migration to the new preprocessor]]参照)。
 
== 制限がおこりやすい事例 ==
読み込み制限は、同じテンプレートを何度も使用している場合によく起こります。例えば、長い表の各行に同じテンプレートを呼び出しているような場合です。テンプレート自体のデータが小さくても、テンプレート呼び出しの際ごとにテンプレートページのソース全体量が計上されますので、思っているよりも簡単に制限値に達することになります。また、当然ながら、呼び出しているテンプレートのサイズが大きければ大きいほど、制限に達するのも早くなります。サイズが大きい理由としてはテンプレート本体が複雑であったり、[[Help:テンプレートの説明文|テンプレートの説明文]]が付随していたり、呼び出し先で必要なデータ以外の多くのデータを含んでいたりすることが考えられます。
 
== 制限値に達しているか判別するには ==
<!--
NewPP limit report
Preprocessor node count: 19412058/1000000
Post-expand include size: 6108266434/2048000 bytes
Template argument size: 1480413611/2048000 bytes
Expensive parser function count: 20/500
-->
</source>
 
/の前の数値が計上された数値、/の後の数値が制限値です。カウンターの仕様展開後読み込み量 (Post-expand include size) などより関しては表示計上され数値は常に制限値よりも小さくなります。もし/の前の数値が制限値(/の後の数値)に近ければ、読み込まれなかったテンプレートがある可能性があります。呼び込まれなかったテンプレートがある場合、この旨を伝えるエラーメッセージがHTMLソース中に表示されます。またいずれかの制限値が上限を越えていると、プレビュー画面でそれぞれに応じた警告が表示されます。
 
== 読み込み制限の仕組み ==
 
=== 展開後読み込み量 ===
ソフトウェアはページ内のソースコードに従って構文解析を行い、テンプレートを展開します。この時、テンプレートによって生成されるHTMLソースコードの長さ(「展開後読み込み量」(post-expand include size))が、「展開後カウンター」に計上されます。もし計上後の数値が「展開後読み込み制限値」を越えていれば、テンプレートはページ内に読み込ま展開されず内部リンクとして表示されます。また生成されたHTMLソース中にエラーメッセージが出力されます。数値が「展開後読み込み制限値」内であれば、テンプレートによって生成されたHTMLコードがページ本体のHTMLの中に組み込まれ、「展開後カウンター」の数値が新しい値に設定されます。
 
テンプレートは再帰的に展開されるため、もし読み込まれているテンプレート自体に他のテンプレートが呼び出されている場合、呼び出されている下位のテンプレートの値も、最終的に呼び出されているページのカウンターの数値に影響します。そのため、下位のテンプレートを呼び出している途中に制限値を超過した場合、テンプレートの展開が途中でとまってしまうこともありえます。