维基百科ひゃっか:かたぎいたげんせい

维基百科ひゃっか自由じゆうてき百科ひゃっかぜん

维基百科ひゃっか所用しょようてきMediaWiki软件使用しよう一组参数来限制页面的复杂度和页面包含其他页面的数量。这些げん制作せいさくよう解析かいせき一个页面时进行包含页面或者替换引用页面是怎样工作,而不包含ほうがん解析かいせき该页めん时的原始げんしげん码的じょう况。ほん页面解析かいせき该限せい如何いか工作こうさくてき如何いかざい这些げんせい正常せいじょう使用しよういたとうこうのう

背景はいけい[编辑]

这是什么?[编辑]

MediaWiki使用しよう語法ごほう分析ぶんせきらいしょうwikitext转化为HTML显示。它是どおり过“预处はたwikitext整理せいり为一种类XMLてきすうすえ结构,しかきさきさいしょう其“てん”,はたそうとんがくくごう包括ほうかつ包含ほうがん页(也就ばん)、变量、术字解析かいせき函数かんすうひとし三尖括号(れい如:ばん变量くくちゃくてき内容ないようがえ换为しょう应的值。

とう页面进行解析かいせき时,かい生成せいせい若干じゃっかん个计すう器用きよう于跟踪页めん生成せいせいてき复杂とう页面开始解しかい析时,计数はつはじめ为0,とう页面てき解析かいせきぎょう为达到计数てきげん值时,解析かいせき处理かいきりせい

为什么要げんせい[编辑]

非常ひじょう长的ある复杂てき页面解析かいせきおこりらい非常ひじょう费时。对于よう户的请求たい验来说相とうこのみ,而且很容易よういくろきゃく利用りようらい进行DDOSおさむ击——也就请求MediaWiki处理解析かいせき极为大量たいりょうてき不合理ふごうりすうすえ。这些げんせい以用らい防御ぼうぎょ这种おさむ击,どう时控せい页面てき渲染ざい合理ごうりてき时间ない当然とうぜんゆう时过于复杂的页面可能かのうかい显示为请もとめちょう时,这取决于ふく务器てき运行负载。

关于げんせいてき作用さよう[编辑]

とう页面达到げんせい时,さいつね见的处理办法まいり见下めんてき方法ほうほうはたばんてき大小だいしょう缩小。如果实在办不いたつきりょうはたばんてき内容ないよう直接ちょくせつてん开到原始げんしてきみなもとだい码中,而非どおり过模ばん嵌入かんにゅうらい让渲しみ时展开。(れい如:直接ちょくせつ使用しよう<references />代替だいたい{{reflist}})。过另いち方面ほうめんばんゆうじょ于服务器避免じゅう复处一些相同的解析数据。

什么时候现问题?[编辑]

页面包含ほうがん上限じょうげん通常つうじょう大量たいりょう调用同一どういつ个模ばんれい如在一个非常长的表格里每行调用一次。虽然每次まいじ调用可能かのうただかい往解析页めんちゅう添加てんか很小てき内容ないよう节数,ただし其每调用依然いぜんかい统计到计数,导致页面过早达到包含ほうがん上限じょうげん一般いっぱんじょう况,页面ただ使用しよう很少量的りょうてきばん并不かい这么かい达到げんせいじょまい个模いた包含ほうがん大量たいりょうてき内容ないよう节数。

如何いか取得しゅとくげんせい報告ほうこく[编辑]

とう页面完成かんせい渲染きさきかいざい页面内容ないよう渲染输出层(也就<div class="mw-parser-output">)てき结尾输出いちだん以HTMLちゅう释标ちゅうてきめい为“NewPP limit report”てききりせい报告,しょうかい包含ほうがんかく计数さい终计すう一些模板用时信息。よし于计すうてき统计方式ほうしき,Preprocessor visited node count、Preprocessor generated node count、Post‐expand include size这三个计数器通常会少于限值的,如果这三个值逼近限制的话,可能かのうかい部分ぶぶんばん内容ないようぼつゆうてん开(而链せってき方式ほうしき显现)。ぼつゆうてん开的ばん位置いちかい标注出来でき包含ほうがんしょう应的错误しんいき

下面かめんWikipedia:すなざい2020ねん9がつ23にち (さん) 10:36 (UTC)まとげんせい报告れい

<!-- 
NewPP limit report
Parsed by mw2316
Cached time: 20200923103611
Cache expiry: 2592000
Dynamic content: false
Complications: []
CPU time usage: 0.136 seconds
Real time usage: 0.185 seconds
Preprocessor visited node count: 358/1000000
Post‐expand include size: 16223/2097152 bytes
Template argument size: 4557/2097152 bytes
Highest expansion depth: 11/40
Expensive parser function count: 6/500
Unstrip recursion depth: 0/20
Unstrip post‐expand size: 1978/5000000 bytes
Lua time usage: 0.041/10.000 seconds
Lua memory usage: 1.11 MB/50 MB
Number of Wikibase entities loaded: 0/400
-->
<!--
Transclusion expansion time report (%,ms,calls,template)
100.00%  138.492      1 -total
 96.32%  133.399      1 Template:請注意ちゅうい:請在這行文字もじそこ進行しんこう您的はかこころみ,請不よう刪除ある變更へんこう這行文字もじ以及這行文字もじ以上いじょうてき份。
 47.18%   65.341      1 Template:Shortcut
 25.37%   35.135      1 Template:Columns
  8.06%   11.159      1 Template:If_mobile
  6.61%    9.148      2 Template:Fullurl
  6.43%    8.909      2 Template:Fullurl2
  3.73%    5.161      1 Template:Div_col
  3.08%    4.260      1 Template:请注意ちゅうい:请在这行文字もじそこ进行您的测试,请不よう删除ある变更这行文字もじ以及这行文字もじ以上いじょうてき部分ぶぶん
  1.55%    2.149      1 Template:NoEdit
-->

另外还有使用しようJavaScript脚本きゃくほん注入ちゅうにゅうしょう应的报告すうすえ以通过调ようJavaScript APImw.config.get("wgPageParseReport")らい获得。

あるもの以通过调ようMediawiki APIaction=parse&prop=limitreportdata|limitreporthtmlらい获得ほんAPI查询そく时的页面あるwikitextてき解析かいせきげんせい报告てきしんいき包括ほうかつよう于JavaScriptてき读数すえ和人わじん类可读的HTMLすうすえ。),注意ちゅういてきただげん于本API查询(理解りかい为重しん调用parseらい渲染ほんてき页面解析かいせき请求),其数值可能かのうあずか现有てき页面输出ゆうしょう许差异。

关于てん[编辑]

ばんちゅう执行てきぶんささえすうすえかいてん解析かいせきてき所以ゆえんかい计入计数ちゅうれい如wikitext{{#if:yes|{{bar}}|{{foo}}}}{{bar}}かいてん开,而{{foo}}则不かいてん开。ただし相反あいはんばんさんすうてき内容ないようてん可能かのう导致计数增加ぞうかそく使つかいさんすうてき内容ないようさい终不かい输出いたさい终结はてれい如wikitext{{#if:{{foo}}|yes|no}}ざい解析かいせき时,{{foo}}てん开后てき内容ないよう节数かい算入さんにゅうてん开后计数ちゅういん为必须将{{foo}}てん开后才能さいのう判断はんだん需要じゅよう选择哪个显示ぶんささえ

部分ぶぶん计数さんすう解析かいせき[编辑]

预处节点计数[编辑]

预处节点(Preprocessor node)表示ひょうじてき页面てき复杂ただし页面てき内容ないよう大小だいしょう)。ざい页面渲染时,かい生成せいせい类似树形てきすうすえ结构よう对应其生成せいせいてきHTML树结构。ざいてん开时树节てんてき每次まいじ访问かい计入いた预处访问节点计数(Preprocessor visited node count)ちゅうとう达到げんせい时,かい生成せいせい“Node-count limit exceeded”てき显示错误。

纯文ほん计数为1,いち对<nowiki>てき内容ないよう计数为3,一个标签头计数为2,如此类推。一个链接内容不会计数,而{{#switch}}まい添加てんか一个判断条件计数增加2。あいどう内容ないようてきばん如果传入さんすうてき话会ただ计算1ただし传入さんすうそく使つかい常数じょうすうてき话则ぶん别计さんそうした,如果ばんただ传入一个固定的模板参数,而且ばんつぎどう样的调用,该模いたてきてん开结はてしょうかいつぎじゅう利用りよう

ちょう过该げんせいてき页面しょうかいざいCategory:页面てき节点すうちょうだしげんせいちゅう显示。

かたぎいたてん开后长度[编辑]

かたぎいたてん开后长度(Post‐expand include size)ゆびしょうばん、变量、解析かいせき函数かんすうてん开后てきwikitextてき节总とう解析かいせきはた一个模板的源码展开出来时(也就ばん调用页面嵌入かんにゅうあるものかえ换引よう),其展开的だい码长度会わたらい累加るいかいた计数ちゅう。如果该计すう值超过限せい解析かいせきりゅうほどかいきりせいてん内容ないようかいがえ换上,并且生成せいせい一段包含错误信息的HTMLちゅう插入そうにゅう其中。如未ちょう过限せい,计数はたがえ换为しんてき计数值,并且继续解析かいせきどう一个模板被多次展开将会多次计入计数值,れい如第いち层wikitext10节长,其中4节普どおり文字もじ,6节调ようばんAてきだい码,ばんAてきwikitextゆう10节长,ばんAてん开后,6节被がえ换为10节,计数るい计为14节。

调用带参すうてきいたかい缓存其展开后内容ないようてきwikitext。所以ゆえんわかばんA包含ほうがんぼつさんすうてきばんB,ばんBざいばんAちゅうつぎ调用ただかい计算一次展开后的长度值,ただし如果ばんB需要じゅよう传入さんすうてき话,则每调用带参すうてきばんB,就算传入りょうしょうどうてきさんすう,还是かいじょう一次展开后的长度值。

ちょう过该げんせいてき页面しょうかいざいCategory:引用いんようばんきさき大小だいしょうちょう过限せいてき页面ちゅう显示。

使用しようちゅう释、<noinclude>、<onlyinclude>[编辑]

ただゆうどおり过预处理扩展阶段てきすうすえざいかい算入さんにゅうてん开后计数ちゅう使用しようHTMLちゅう释的だい部分ぶぶんかい算入さんにゅうてん开后计数ちゅう,而且其结はて也不かい输出いたさい终HTMLだい码中。ざい<noinclude>ないある<onlyinclude>外的がいてきwikitext也不かいてん开而计算いたてん开后计数ちゅう。这也意味いみどおり包含ほうがんばんらい对页めん进行ぶん类时,ただゆう包含ほうがん时产せいぶん效果こうかざいかい贡献てん开后计数值。

はま套展开[编辑]

注意ちゅうい所有しょゆうてん开的ばん解析かいせき函数かんすうてきwikitextてん开值累加るいか值,そく使つかいはま套的じょう况。(phab:T15260所以ゆえんかい产生额外てきすうじゅう复。れい如模ばんA包含ほうがんばんB,ばんB包含ほうがんばんC,ばんCてきてん开后节数かいばんAてき计数计算りょう2つぎ。类似ゆうざいばんちゅう包含ほうがんいち解析かいせき函数かんすうある解析かいせき函数かんすう使用しようりょうばんてき输出值作为其输入さんすうとう所以ゆえんゆう时候需要じゅよう使用しよう直接ちょくせつ产生ばんてき调用めいらい代替だいたい直接ちょくせつ产生ばん结果,らい避免这种计すうじゅう复。

れい如:

{{#if:{{{test|}}}|{{template1}}|{{template2}} }}

应该がえ换为

{{ {{#if:{{{test|}}}|template1|template2}} }}

ぼつ渲染出来できてきてん[编辑]

ぼつ渲染出来できてきてん开也可能かのうかい计入统计すうちゅうつね见的解析かいせき函数かんすうちゅうifてき条件じょうけん判断はんだんどおり过输いれ一个模板展开后的内容,れい如这样{{#if:{{SB}}|...}},这样判断はんだん内容ないようそく使ぼつ输出渲染,一样被算入展开的计数中。对于Lua也有やゆう类似道理どうりれい如通过mw.getCurrentFrame():preprocessてき外部がいぶ解析かいせき方法ほうほう解析かいせき内容ないようただしまたぼっゆうはた其输,一样被算入展开的计数中。

#invoke 语法[编辑]

ゆう些模ばん实际じょう其Lua组实现的包装ほうそう(warpper),れい如{{Navbox}},如果调用其模ばん而是直接ちょくせつ调用其内调用组的语句(れい如{{Navbox}}以{{#invoke:Navbox|navbox|...}}代替だいたい),也能くだていてん开量计数,原理げんり实际就是はま套展开ただしよし于这样会くだていだい码可读性,とくやめけん议这样做。

拆分条目じょうもく[编辑]

理想りそうじょう况下,条目じょうもく长度应该よし内容ないようしょう关决てい而非わざ术问题,ただし如果よし于一个长条目じょうもくれい如长れつひょう)无法かい决展开量问题,可能かのう需要じゅよう拆分条目じょうもくらい使つかいごと个小条目じょうもくちょう过展开量げんせい

ばんさん数字すうじ节计すう[编辑]

ばんさん数字すうじ节计すう(Template argument size)よう于跟踪被がえ换的计算ばんさんすう总长

れい如,かり设{{2x}}よう于将さんすう1てき内容ないよう连续复制2どう,{{3x}}为复せい3,则{{3x|{{2x|abcde}}}}计算记为40节,さんすう“abcde”计算りょう2さんすう“abcdeabcde”计算りょう3

ばん传入さんすうぼついたない变量ひきはい调用てき计入计算ちゅう

如果使用しようりょうswitch解析かいせき函数かんすうぼつひきはいてきまいりすうかい计入计算,如果存在そんざいひきはいてき话,ひきはいてき键参すう长度かい计算为2ひきはいてき值参すう长度计算1,按照其赋值的てん开后值长计算。

包含ほうがん该页めんちょうばんさんすう大小だいしょうげんせいてき页面しょうかいざいCategory:含有がんゆうりゃく过模ばんさんすうてき页面ちゅう显示。

最大さいだい扩展深度しんど[编辑]

最大さいだい扩展深度しんど(Highest expansion depth)よう于跟踪模いたてん开后しょ达到てき最大さいだい层级计数,该计すうげん值默认为40。

ちょう过该げんせいてき页面しょうかいざいCategory:ばん递归深度しんどちょうだしげんせいてき页面ちゅう显示。

こう开销解析かいせき函数かんすう调用次数じすう[编辑]

こう开销解析かいせき函数かんすう调用次数じすう(Expensive parser function calls)よう于跟踪部分ぶぶんだか开销てき解析かいせき函数かんすうてき使用しよう次数じすう,该计すうげん值默认为500。

以下いか为属于高开销てき解析かいせき函数かんすう术字あるあい应调よう

  • #ifexist——判断はんだん存在そんざい特定とくてい页面らい选择ぶんささえとう达到げんせい时,しょうかい认为特定とくてい页面存在そんざい
  • PAGESINCATEGORY ある PAGESINCAT
  • PAGESIZE
  • CASCADINGSOURCES
  • REVISIONUSER
  • REVISIONTIMESTAMP
  • 部分ぶぶんLua对象方法ほうほう

ざいLua脚本きゃくほんなか以通过调ようmw.incrementExpensiveFunctionCountらい手工しゅこう增加ぞうかだか开销解析かいせき函数かんすうてき调用次数じすう数量すうりょう

ちょう过该げんせいてき页面しょうかいざいCategory:ゆう过多だか开销解析かいせき函数かんすう调用てき页面ちゅう显示。

关于{{#time}}解析かいせき函数かんすう[编辑]

{{#time}}てき格式かくしきくしきりせいざい6000个字ちょう则显しめせ错误(对应消息しょうそくMediaWiki:Pfunc_time_too_long)。一个格式化字符串或时间表达式展开后的wikitext,しょうかい缓存おこりらいのうじゅう使用しよう,而只计算一份展开字节量。

ほん方法ほうほう调用ぼつゆうざい计数显示统计すうすえ

Special:てん开模ばん[编辑]

とう页面达到げんせい时,一个比较粗糙的排查方法是通过Special:てん开模ばんらいはい查。不同ふどう于替换,它会递归てん开全层级,需要じゅよう使用しようsafesubst:ある类似てきだい码来はた其替换展开。じょりょう预处节点计数,其他计数しょうかい设定为0,らいくだていいたてん开的げんせい

历史[编辑]

2006ねん8がつ14にちUser:Tim Starling ざいえい语维もと百科上开始尝试限制模板的引用。而新てき解析かいせき处理则在2008ねん1がつ投入とうにゅう使用しよう,并且はた其中いち个参すうてん开前计数”(pre-expand include limit)あらためよう预处节点计数らい代替だいたい。其中2006ねんてきこうのう引入确立りょうてん开前计数てききりせい为2MB,该限せい也延续到相似そうじさんすうてん开后计数ちゅう

部分ぶぶんいたげんせい问题てきつね见解决[编辑]

  • 使用しよう{{NavboxV2}}尝试かい决{{Navbox}}导致てきばんちょう载问题,ゆう其是以子Navboxさく为每list项分组内容ないよう时。
  • 直接ちょくせつ链接いたばん页面,而非嵌入かんにゅう一个展开字节量大的模板、さく为另一个模板的传参,きよしはんれいSpecial:Diff/70473549
  • 減少げんしょう使用しよう{{Navboxes}}收納しゅうのうかんせいばん使用しようNavboxes收納しゅうのうばん內部連結れんけつ不在ふざい此限),あるもの使用しよう{{Navboxes top}}かず{{Navboxes bottom}}はい使用しよう代替だいたい
  • ばんちゅう使用しようhlistcss类名じょうwikicode无序列じょれつひょう语法(*),代替だいたい{{}}{{·}}{{,}}{{.w}}とうばんいん为后めん这些いたてん开字节较だいきよしはんれいSpecial:Diff/70435404まちきよしてきいたCategory:ぼつゆう使用しよう水平すいへいれつひょうてき导航かまち[1][2][3][4]
  • はた参考さんこうれつひょうばん{{reflist}}てん开为纯HTML内容ないよう<references />。页面解析かいせき逼近てん开限せい值时,无法继续渲染{{reflist}}
  • 避免嵌入かんにゅうふとおお公共こうきょう轉換てんかんぐみいた{{noteTA}}。部分ぶぶん转换组展开量很大,じょさとめんてき项目のう大量たいりょう适配行文こうぶんちゅうよう词,いや则没必要ひつよう为一两个用词引入庞然巨物。參考さんこうこう级字词转换语ほうてきH語法ごほうきよしはんれいSpecial:Diff/74029949),单次使用しよう手工しゅこう轉換てんかんきよしはんれいSpecial:Diff/71591061),あるものざい{{noteTA}}添加てんか少量しょうりょうわたる及的よう词转换。
  • はたやめ有本ありもと條目じょうもくてきまたがげん連結れんけつあらためため一般いっぱん內部链接きよし方式ほうしき跟待きよしれつひょうCategory:ゆう蓝链却未うつりじょ内部ないぶ链接助手じょしゅばんてき页面特別とくべつおう優先ゆうせんしんばんいんため影響えいきょうぺーじめん較多。

其他参考さんこう资料[编辑]