Page semi-protected

도와 주세요.:템플릿 제한

Help

Wikipedia를 지원하는 MediaWiki 소프트웨어에는 페이지의 복잡성과 포함할 수 있는 데이터의 양을 제한하는 몇 가지 매개 변수가 있습니다.이러한 제한은 주로 페이지 자체의 소스에 직접 있는 데이터가 아니라 페이지 확장 중에 변환되거나 대체되는 데이터와 관련이 있습니다.이 페이지에서는 이러한 제한이 적용되는 방법과 이유 및 사용자가 제한 내에서 작업할 수 있는 방법에 대해 설명합니다.

배경

무슨 일인가?

Wiki 소스에서 페이지의 HTML을 생성하는 MediaWiki 소프트웨어는 포함된 데이터를 처리하기 위해 파서를 사용합니다.이는 "프리프로세서"를 사용하여 Wikitext를 XML 트리로 알려진 데이터 구조로 변환한 후 이 트리를 사용하여 "확장"된 Wikitext를 생성합니다. 여기서 이중 및 삼중으로 구분된 구조는 결과에 따라 대체됩니다.

변환 프로세스 중에 소프트웨어는 여러 카운터를 사용하여 생성되는 페이지의 복잡성을 추적합니다.페이지 해석 시작 시 이들 카운터는 0으로 설정되지만 다음과 같이 해석 프로세스 중에 증가합니다.이러한 카운터에는 상한치가 있으며 파서는 이러한 제한을 초과할 수 없습니다.

왜 한계가 있는 거죠?

매우 길거나 복잡한 페이지는 구문 분석 속도가 느립니다.이는 사용자에게 불편할 뿐만 아니라 서버에 Denial of Service(DoS; 서비스 거부) 공격을 가하기 위해서도 사용할 수 있습니다.이 공격에서는 페이지 요구에 의해 MediaWiki 소프트웨어가 대량의 데이터를 해석하도록 강제됩니다.이러한 제한은 이러한 종류의 공격을 방지하고 페이지가 적절한 시간에 렌더링되도록 하는 데 도움이 됩니다.(단, 제한 범위 내의 복잡한 페이지는 타임아웃오류를 발생시킬 수 있습니다.이것은 서버의 사용 상황에 따라 다릅니다).

제한 범위 내에서 작업

페이지가 템플릿 제한에 도달했을 때 가장 일반적인 해결책은 아래에 설명된 방법을 사용하여 템플릿을 더 짧게 만드는 것입니다.이것이 불가능할 경우 템플릿에서 데이터를 변환하지 않고 페이지 소스에 직접 더 많은 데이터를 포함해야 할 수 있습니다(예를 들어 참조를 수동으로 포맷하거나 {{Reflist}} 대신 <references />를 사용합니다).한편, 템플릿은 서버가 중복 작업을 하지 않도록 하는 데 도움이 됩니다(아래 참조).

언제 문제가 발생합니까?

포함 제한은 같은 템플릿을 여러 번 사용하는 페이지에서 가장 일반적으로 도달합니다. 예를 들어 긴 테이블의 행당 하나의 변환을 사용합니다.템플릿이 최종 페이지에 추가하는 데이터의 양은 적을 수 있지만 템플릿이 사용될 때마다 카운트되기 때문에 예상보다 빨리 한계에 도달할 수 있습니다.템플릿 자체에 많은 데이터가 포함되지 않는 한, 수십 개의 템플릿만 포함된 페이지는 포함 제한을 초과할 수 없습니다.

어떻게 알 수 있죠?

페이지 본문이 처리되면 HTML 코멘트가 페이지의 HTML 코드 끝에 다양한 카운터의 최종값과 함께 추가됩니다.를 들어, HIV/AIDS 페이지(2012년 8월 8일)에는 생성된 HTML 소스에 다음과 같은 코멘트가 포함되어 있습니다.

<!-- NewPP 제한 보고서 프리프로세서 노드 수: 173488/1000000 확장 후 포함 크기: 1557895/2048000 바이트 템플릿 인수 크기: 561438/2048000 바이트 최대 확장 깊이: 29/40 고가의 파서 함수 수: 7/500 --> 

(모듈 이름 공간이 있는 Wiki에서는 "Lua time usage" 및 "Lua memory usage" 항목이 이 목록에 추가됩니다).

카운터가 증가하는 방식 때문에 처음 3개의 카운트는 보통 제한보다 작습니다.이러한 크기가 제한에 가까운 경우 일부 템플릿이 확장되지 않았을 수 있습니다.전개되지 않은 템플릿의 각 발생은 오류 메시지를 포함하는 HTML 코멘트에 의해 페이지 본문에서 식별됩니다.

2013년 4월 1일 갱신:

<!-- NewPP 제한 보고서 프리프로세서 방문 노드 수: 19190/1000000 프리프로세서 생성 노드 수: 94558/1500000 확장 후 포함 크기: 714878/2048000 바이트 템플릿 인수 크기: 25507/2048000 바이트 최대 확장 깊이: 13/40 고가의 파서 함수 수: 13/500 Lua 시간 사용: 0.331초 Lua 메모리 사용량: 1.25 MB --> 

유사 데이터를 저장하지 않고 미리보기에 대한 데이터를 보려면 미리보기의 맨 아래에 있는 "파서 프로파일링 데이터"를 누르십시오.

확장

조건부 파서 함수의 실행되지 않은 분기의 템플릿은 확장되지 않으므로 카운트되지 않습니다.예를 들어, 코드에서는{{#if:yes {{bar}} {{foo}}}}, 템플릿{{bar}}확장되지만 템플릿은{{foo}}는 확장되지 않습니다.단, template 인수는 최종 출력에 표시되지 않더라도 카운트에 기여할 수 있습니다.예를 들어, 코드가{{#if:{{foo}} yes no}}템플릿 확장 버전의 길이가 해석됩니다.{{foo}}조건의 어느 브랜치를 선택할지를 결정하기 위해서 템플릿을 전개할 필요가 있기 때문에, 이 카운터에 추가됩니다.

프리프로세서 노드 수

프리프로세서 노드 수는 (데이터 볼륨이 아닌) 페이지의 복잡성을 측정합니다.파서는 페이지를 확장할 때 페이지의 HTML 구조에 대응하는 트리라고 하는 데이터 구조를 작성합니다.확장 중에 방문되는 트리의 각 노드는 프리프로세서 노드 수로 카운트됩니다.이 카운트를 초과하면 파서는 생성된HTML에 표시되는 "Node-count limit exceededed" 오류와 함께 해석을 중단합니다.

일반 텍스트의 경우 카운트는 1로 시작합니다.한 쌍의 nowiki 태그는 3, 헤더는 2 등으로 카운트됩니다.링크는 카운트에 영향을 주지 않습니다.확장의 경우#switch체크된 모든 조건은 카운트에 2를 추가합니다.동일한 템플릿이 여러 번 확장되는 경우 인수가 없는 템플릿의 내용은 한 번만 카운트되지만 인수가 있는 템플릿의 내용은 여러 번 카운트됩니다(상수인 경우에도).이와는 대조적으로 확장 결과는 템플릿파라미터에 할당되어 있고 템플릿은 이 파라미터를 여러 번 사용하고 있는 경우 1회만 카운트하여 여러 번 사용할 수 있습니다.

이 제한을 초과하는 페이지는 자동으로 카테고리로 분류됩니다.노드 수가 초과된 페이지(최근 추가).

확장 후 포함 크기

확장include 크기는 템플릿, 파서 함수 및 변수에 의해 생성된 확장 Wikitext 길이의 합계입니다.페이지 소스 코드에 의해 파서가 템플릿 등을 전개하도록 지시될 때마다(즉, 변환 또는 치환으로 대체하기 위해) 파서는 템플릿 등에 의해 생성된 확장 Wikitext의 길이와 페이지의 현재 카운터 값을 합산합니다.이 합계가 확장 후 제한(최대 기사 크기 제한과 동일)보다 크면 초기 템플릿 등은 대체되지 않고 출력 HTML에 주석으로 오류 메시지가 추가되며, 그렇지 않으면 확장 후 카운터가 새로운 값으로 증가하여 파싱이 계속됩니다.페이지에서 두 번 이상 확장되는 템플릿은 확장 후 include 크기에 여러 번 기여합니다.

인수가 없는 템플릿 호출에는 확장된 텍스트 캐시가 있습니다.그래서 만약에{{foo}}두 번째 수준의 메타데이터를 포함합니다.{{bar}}를 여러 번 호출합니다.{{foo}}는, 완전 확장 후의 인크루드 사이즈만 증가시킵니다.{{foo}}; secondary는 다음을 포함한다.{{bar}}한 번만 카운트됩니다.단, 같은 템플릿을 여러 번 포함했을 경우{{foo arg}}세컨더리 템플릿은 인수가 같은 경우에도 매번 카운트됩니다.

확장 후 포함 크기 제한을 초과하는 페이지는 자동으로 카테고리에 추가됩니다.확장크기가 포함된 페이지가 초과되었습니다(최근 추가).템플릿:PEIS 제한에서 깨진 인용문은 이 문제로 인해 인용문 또는 템플릿이 깨진 경우 페이지에 수동으로 추가할 수 있습니다.phab도 참조해 주세요.T189108.

코멘트 사용, noinclude 및 only include

프리프로세서 확장 단계에서 살아남은 데이터만 확장 후 카운터로 카운트됩니다.Wikitext 내의 HTML 코멘트 길이(생성된 HTML 소스에서는 복제되지 않음)는 확장 후 카운터에 포함되지 않습니다.<noinclude> 섹션 내부 또는 <only include> 섹션 외부에 있는 코드는 전개되지 않으므로 이러한 섹션은 전개 후의 크기에 영향을 주지 않습니다.즉, 카테고리 태그가 포함되어 있는 경우(템플릿을 호출하는 페이지를 분류하는 경우)에만 적용됩니다.

중첩된 트랜슬레이션

확장 템플릿 및 파서 함수의 모든 Wikitext 크기는 네스트의 경우에도 추가됩니다(phab:T15260)를 사용하여 레벨을 높입니다.페이지 A가 B를 변환하고 B가 C를 변환하는 것 이외에는 아무것도 하지 않는 경우, C의 사이즈는 A 페이지의 확장 후의 include 사이즈에 대해서2회 카운트 됩니다.또, 템플릿이 파서 함수 호출로 구성되어 있거나, 파서 함수에 템플릿콜이 파라미터로 설정되어 있는 경우도 마찬가지입니다.이는 파서 함수가 템플릿 결과 대신 템플릿 이름을 생성하도록 함으로써 완화될 수 있습니다(예: 치환).

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

와 함께

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

비렌더링 트랜슬레이션

비렌더링 트랜슬레이션은 여전히 제한에 해당합니다.예를 들어, 다음 항목만 포함하는 페이지입니다.{{#if:{{:Main Page}}}}출력은 전혀 없더라도 포스톨 후의 사이즈는 그대로입니다.

Scribunto 모듈에도 동일하게 적용됩니다.예를들면,{{#invoke:Test main}}모듈:테스트는 간단했습니다.

.get Current Frame(전류 프레임)():전처리'{msgnw:: 메인페이지}'-- 이 행을 삭제하면 삽입 사이즈가 0이 됩니다. 돌아가다 {주된 = 기능.()끝.}-- p.main()에는 반환값이 없습니다. 

템플릿 인수 크기

template 인수 크기 카운터는 대체된 템플릿 인수의 총 길이를 추적합니다.제한은 기사 크기 제한과 동일합니다.

예:

{{3x {{2x abcde}}}}템플릿 인수 사이즈는 40바이트입니다.인수:abcdeabcde인수는 3회 카운트됩니다.abcde두번이라.

템플릿의 파라미터 태그와 일치하지 않는 템플릿콜의 인수는 카운트되지 않습니다.

템플릿에 스위치가 포함되어 있는 경우 일치 이외의 템플릿 인수를 사용해도 카운트되지 않습니다.일치하는 대소문자를 포함하여 등호 왼쪽에 사용되는 템플릿 인수는 2회 카운트됩니다.등호 오른쪽에 있는 부호는 일치하는 경우에만 카운트됩니다.

템플릿 인수 크기 제한을 초과하는 페이지는 자동으로 카테고리에 추가됩니다.생략된 템플릿 인수를 포함하는 페이지(최근 추가).

최대 확장 깊이

이 제한을 초과하는 페이지는 자동으로 카테고리로 분류됩니다.확장 깊이를 초과한 페이지(최근 추가).

고가의 파서 함수 호출

고가의 파서 함수 수에는 500의 제한이 있습니다.즉, 고가의 파서 함수의 콜 수는 다음과 같습니다.

  • #존재하는 경우– 특정 페이지가 존재하는지 여부에 따라 분기됩니다.이 카운터의 제한을 초과하면 추가 #ifexist 콜은 쿼리하는 페이지가 존재하지 않는 것처럼 동작합니다.
  • 페이지 구분 카테고리 또는 페이지 구분
  • 페이지 크기
  • 캐스케이드 리소스
  • REVIESUSER, 현재 페이지 이외의 페이지에서 사용되는 경우
  • REVISIONTIMESTAMP, 현재 페이지 이외의 페이지에서 사용되는 경우
  • 일부 Lua 함수는 이 목록의 다른 항목과 동일합니다.

mw.incrementExpensiveFunctionCount를 사용하여 Lua 모듈에서 고가의 파서 함수 카운트를 수동으로 늘릴 수도 있습니다.

이 제한을 초과하는 페이지는 자동으로 카테고리로 분류됩니다.값비싼 파서 함수 호출이 너무 많은 페이지(최근 추가)

참고 항목: mw:Manual:$wgExpensiveParserFunctionLimit, 템플릿:고가의

시간

함수 형식 문자열의 총 길이입니다.#time는 6000자로 제한됩니다[ 1 ] 。MediaWiki에서 다음 오류 메시지가 나타납니다.Pfunc 시간이 너무 깁니다).포맷 문자열의 확장 Wikitext와 표현식의 확장 Wikitext의 각 조합(예: "2008년 3월 1일 - 1일")에 대해 결과가 캐시되므로 반복 사용은 계산되지 않습니다.

안타깝게도 카운트는 제한 보고서에 없습니다.

스페셜:템플릿 확장

페이지가 제한을 초과하면 문제를 해결하는 대략적인 방법 중 하나는 Special을 사용하는 것입니다.ExpandTemplates.치환과는 달리 코드를 사용하여 템플릿을 특별히 준비할 필요 없이 모든 레벨을 동시에 확장합니다.{{{ safesubst:}}}또는 유사합니다(버그 2777 참조).이것에 의해, 프리프로세서노드수를 제외한 모든 카운트가 제로로 감소합니다만, 그마저도 통상, 제한 범위내에 있는 수치로 감소합니다.

이력

포함 제한은 2006년 8월 14일 스털링에 의해 영어 위키피디아에 발효되었다.2008년 1월에 새로운 프리프로세서가 유효하게 되어, 「프리 익스팬드 인크루드 제한」이 삭제되어 「프리프로세서 노드 수」의 제한으로 대체되었습니다.

템플릿 문서 페이지를 사용하는 방법은 다른 이유로도 유용하지만 템플릿을 호출하는 페이지에서 문서가 계산되는 것을 피하기 위해 더 이상 필요하지 않습니다.

레퍼런스