質問ウィキペディア日本語版のヘルプページです。棒グラフの書き方サンドボックスウィキポータルウィキペディアの使用しているソフトウェアであるMediaWikiには、テンプレート呼び出しやテンプレートの代入展開によってページに読み込まれるデータ量を制限するためのパラメータがいくつかあります。このページでは、なぜ、そしてどのようにこの制限が用いられているかについて解説しています。概要[編集]MediaWikiでは、ウィキテキスト(ウィキソース)をもとにHTMLページが生成されますが、読み込みデータについては構文解析の一種(再帰下降構文解析)を使用しています。ウィキテキストは「プリプロセッサ」を用いて「ツリー」と呼ばれるデータ構造に変換され、このツリーを用いてHTMLソースが生成されます。構文解析の過程では、生成されるページの複雑性を把握するためにいくつかのカウンターが使用されます。カウンターは解析開始時点でゼロに設定され、解析中に該当するプロセスがあると数値が計上されていきます。カウンターには上限値が設定されており、上限値を越えるとテンプレートの展開や関数の動作が停止されます。極端に長いページやテンプレートをたくさん呼び出しているような複雑なページは解析に時間がかかります。このことは利用者にとって不便なだけでなく、処理不可能なほど巨大なデータをMediaWikiに解析させることでDoS攻撃の手段として悪用される可能性もあります。このような攻撃を予防し、ページの読み込みが常識的なスピードで行われることを保証するために、このような制限が設定されています。読み込みデータの制限は、2006年8月より導入されました。preprocessor参照)。制限がおこりやすい事例[編集]読み込み制限は、同じテンプレートを何度も使用している場合によく起こります。長い表の各行に同じテンプレートを呼び出しているような場合です。テンプレート自体のデータが小さくても、テンプレート呼び出しの際ごとにテンプレートページのソース全体量が計上されますので、思っているよりも簡単に制限値に達することになります。当然ながら、呼び出しているテンプレートのサイズが大きければ大きいほど、制限に達するのも早くなります。サイズが大きい理由としてはテンプレート本体が複雑であったり、呼び出し先で必要なデータ以外の多くのデータを含んでいたりすることが考えられます。制限値に達しているか判別するには[編集]生成されたページ本体のHTMLソース中には、ソースの比較的末尾にHTMLコメントによってカウンターの数値が描き込まれています。そこで、ブラウザのHTMLソースを表示する機能を利用してHTMLソースを確認することで、そのページのカウンターの数値を知る事ができます。版)のページの生成されたHTMLソースにはつぎのコメントが含まれています。0/500-->/の前の数値が計上された数値、/の後の数値が制限値です。関しては、計上された数値(/の前)が制限値(/の後)に近ければ、読み込まれなかったテンプレートがある可能性があります。呼び込まれなかったテンプレートがある場合、この旨を伝えるエラーメッセージがHTMLソース中に表示されます。いずれかの制限値が上限を越えていると、プレビュー画面でそれぞれに応じた警告が表示されます。count)のカウンターは新プリプロセッサから採用されました。これは、データの量ではなく、ページの複雑性を計測しています。解析によってページが展開される時には、HTMLの構造に対応する「ツリー」と呼ばれるデータ構造を生成しますが、このツリーのノードの数を計るものです。エラーメッセージを生成します。ノード数にはテンプレートだけでなく、リンク、セクション見出し、HTML要素などがすべて計上されています。展開後読み込み量[編集]ソフトウェアはページ内のソースコードに従って構文解析を行い、テンプレートを展開します。size))が、「展開後カウンター」に計上されます。計上後の数値が「展開後読み込み制限値」内であれば、テンプレートによって生成されたHTMLコードがページ本体のHTMLの中に組み込まれ、「展開後カウンター」の数値が新しい値に設定されます。計上後の数値が「展開後読み込み制限値」を越えていれば、テンプレートはページ内に展開されず内部リンクとして表示されます。生成されたHTMLソース中にエラーメッセージが出力され、自動的にCategory:テンプレート読み込みサイズが制限値を越えているページに追加されます。テンプレートは再帰的に展開されるため、もし読み込まれているテンプレート自体に他のテンプレートが呼び出されている場合、呼び出されている下位のテンプレートの値も、最終的に呼び出されているページのカウンターの数値に影響します。そのため、下位のテンプレートを呼び出している途中に制限値を超過した場合、テンプレートの展開が途中でとまってしまうこともありえます。カウンターはテンプレートがページに読み込まれるたびに増加しますので、1ページ内に何度も使用されているテンプレートがあった場合、読み込まれている回数分、カウンターの数値が増加することになります。引数を指定していないテンプレートでは展開後のテキストのキャッシュを使用します。複数回呼び出しても、{{bar}}は1回分だけ計上され、その後は{{foo}}をフル展開した分だけが展開後読み込み量に計上されます。展開量も計上されます。条件文を用いたテンプレートの実行されない部分は展開されません。最終的な出力結果には表れないテンプレートの引数が展開後読み込み量に計上されることがあります。展開量が展開後カウンターに計上されます。ちなみに新プリプロセッサの導入前は、テンプレートの展開前のデータ量も計測しており、これがテンプレートの制限でもっとも問題になっていました。size)カウンターは、代入されるテンプレート変数の引数を計上します。count)は、条件文中の負荷の高い関数の使用回数を500以下に制限するものです。対象となるのは以下のものです。#ifexist:この関数は、指定されたページが存在するかどうかで出力を切り替えるのに使用されます。ページの存在はすべてないものとして返されます。PAGESINCATEGORY:与えられたカテゴリに含まれるページ数を返します。PAGESIZE:与えられたページのサイズを返します。カウンタが500を越えているページはCategory:高負荷な構文解析関数の呼び出しが多過ぎるページへ自動的にカテゴライズされます。同じテンプレートの呼び出しを避けることです。テンプレートAを何度も呼び出す代わりに、Aを引数にとるテンプレートBを呼び出すということが可能な場合があります。現在のところ、展開後読み込み量のカウンタの仕様により、入れ子のテンプレート呼び出しは特に高負荷となっています。ページAがページBを呼び出しており、ページBは単にページCを呼び出している時、ページAの展開後読み込み量にCのサイズが2回分計上されます(bugzilla:13260参照)。これは条件文にも適用されます。条件文中にテンプレート呼び出しがあると、最終的な呼び出し先ページの展開後読み込み量に2回計上されます。複雑なテンプレートについてはLuaで書きなおすことで改善される可能性があります。これでも解決しない場合、テンプレート呼び出しではなく、ページ本体に直接記述するデータを増やすことを考えてみてください。その際には特別ページのテンプレートを展開が利用できます。呼び出しが多すぎます」という警告文が表示されることがあります。ようにベタ打ち入力されていると、日本語版ではYYYY-MM-DD形式に自動で変換し、テンプレートの読み込み制限を超過してしまうためです。日付をYYYY-MM-DD形式に変更するか、別の出典用テンプレートを活用することでエラーを回避できます。(日時は個人設定で未設定ならばUTC)。表示-継承ライセンスの下で利用可能です。追加の条件が適用される場合があります。詳細は利用規約を参照してください。Cookieに関する声明モバイルビュ。