Страница полузащищенная
Из Википедии, бесплатной энциклопедии
  (Перенаправлено из Википедии: PEIS )
Перейти к навигации Перейти к поиску

Программное обеспечение MediaWiki , на котором основана Википедия, имеет несколько параметров, которые ограничивают сложность страницы и объем данных, которые могут быть включены. Эти ограничения в основном касаются данных, которые включаются или заменяются при расширении страницы, в отличие от данных непосредственно в источнике самой страницы. На этой странице объясняется, как и почему применяются эти ограничения, и как пользователи могут работать в рамках этих ограничений.

Задний план

О чем это?

Программное обеспечение MediaWiki , которое генерирует HTML- код страницы из своего источника вики, использует синтаксический анализатор для работы с включенными данными. Это делается с помощью «препроцессора», который преобразует викитекст в структуру данных, известную как XML-дерево, а затем использует это дерево для создания « расширенного » викитекста, в котором структуры, заключенные в двойные и тройные скобки, заменяются их результатом.

В процессе преобразования программное обеспечение использует несколько счетчиков для отслеживания сложности создаваемой страницы. Когда начинается синтаксический анализ страницы, эти счетчики устанавливаются на ноль, но они увеличиваются в процессе синтаксического анализа, как описано ниже. Для этих счетчиков существуют верхние пределы, и синтаксический анализатор не допускает превышения этих пределов.

Почему есть ограничения?

Очень длинные или сложные страницы обрабатываются медленно . Это не только неудобно для пользователей, но также может использоваться для организации атаки типа «отказ в обслуживании» (DoS) на серверах, при которой запрос страницы вынуждает программное обеспечение MediaWiki анализировать неоправданно большой объем данных. Ограничения помогают предотвратить подобные атаки и обеспечить отображение страниц в разумные сроки. (Тем не менее, иногда сложная страница в установленных пределах дает ошибку тайм-аута; это зависит от того, насколько загружены серверы.)

Работаем в рамках

Когда страница достигает пределов шаблона, наиболее распространенное решение - сделать шаблоны короче, используя методы, описанные ниже. Если это невозможно, может потребоваться включить больше данных непосредственно в исходный код страницы, а не включать их из шаблонов (например, форматирование ссылок вручную или использование <links /> вместо {{Reflist}}). С другой стороны, шаблон может помочь серверу избежать дублирования работы, см. Ниже.

Когда возникают проблемы?

Пределы включения обычно достигаются на страницах, которые используют один и тот же шаблон много раз, например, используя одно включение для каждой строки длинной таблицы. Даже несмотря на то, что объем данных, который шаблон добавляет на конечную страницу, может быть небольшим, он подсчитывается каждый раз, когда шаблон используется, и поэтому ограничение может быть обнаружено раньше, чем ожидалось. Страницы, содержащие всего несколько десятков шаблонов, вряд ли превысят ограничения на включение, если сами эти шаблоны не содержат большого количества данных.

Как узнать?

После обработки тела страницы в конец HTML-кода страницы добавляется HTML-комментарий с окончательными значениями различных счетчиков. Например, страница ВИЧ / СПИД (от 8 августа 2012 г.) в сгенерированном исходном HTML-коде содержит следующий комментарий:

<! - Отчет об ограничении NewPP Количество узлов препроцессора: 173488/1000000 Размер включения после развертывания: 1557895/2048000 байтов Размер аргумента шаблона: 561438/2048000 байтов Максимальная глубина раскрытия: 29/40 Количество дорогостоящих функций синтаксического анализатора: 7/500 ->

(На вики-сайтах с пространством имен Module в этот список добавляются элементы «Использование времени Lua» и «Использование памяти Lua».)

Из-за способа увеличения счетчиков первые три счета обычно меньше установленных пределов. Если какой-либо из этих размеров близок к пределу, вероятно, некоторые из шаблонов не были расширены. Каждое появление нераскрытого шаблона идентифицируется в теле страницы комментарием HTML, содержащим сообщение об ошибке.

Обновление 1 апреля 2013 г .:

<! - Отчет об ограничении NewPP Число посещенных препроцессором узлов: 19190/1000000 Число созданных препроцессором узлов: 94558/1500000 Размер включения после расширения: 714878/2048000 байт Размер аргумента шаблона: 25507/2048000 байт Максимальная глубина раскрытия: 13/40 Дорогой синтаксический анализатор количество функций: 13/500 Использование времени Lua: 0,331 с Использование памяти Lua: 1,25 МБ ->

Щелкните «Данные профилирования парсера» внизу окна предварительного просмотра, чтобы просмотреть аналогичные данные для предварительного просмотра без их сохранения.

Расширение

Шаблоны в невыполненных ветвях функций условного синтаксического анализатора не раскрываются и, следовательно, не учитываются. Например, в коде {{#if:yes|{{bar}}|{{foo}}}}шаблон {{bar}}раскрывается, но шаблон {{foo}}не раскрывается. Тем не менее, аргумент шаблона может участвовать в подсчете, даже если он не отображается в окончательном выводе. Например, если код {{#if:{{foo}}|yes|no}}анализируется, длина расширенной версии шаблона {{foo}}будет добавлена ​​к счетчику после расширения, потому что этот шаблон должен быть расширен, чтобы решить, какую ветвь условного выражения следует выбрать.

Количество узлов препроцессора

В кол препроцессора узел измеряет сложность страницы (не объем данных). Когда синтаксический анализатор расширяет страницу, он создает структуру данных, известную как дерево, которая соответствует структуре HTML страницы. Каждый узел дерева, который посещается во время раскрытия, засчитывается в счетчик узлов препроцессора. Если это количество превышено, синтаксический анализатор прекратит синтаксический анализ с ошибкой «Превышен предел количества узлов», видимой в сгенерированном HTML.

Счетчик начинается с 1 для обычного текста. Пара тегов nowiki считается за 3, заголовок - за 2 и т. Д. Ссылка не участвует в подсчете. При расширении #switchкаждого проверенного условия к счету прибавляется 2. В случае нескольких расширений одного и того же шаблона содержимое шаблона без аргументов учитывается только один раз, а содержимое шаблона с аргументами (даже если оно постоянное) учитывается несколько раз. В отличие от этого, результат раскрытия может использоваться несколько раз при подсчете только один раз, если он назначен параметру шаблона, и этот шаблон имеет несколько применений этого параметра.

Страницы, превышающие этот предел, автоматически попадают в категорию « Категория: страницы, где превышено количество узлов ( недавние добавления )».

Включать размер после развертывания

Размер включения после расширения - это сумма длин расширенных викитекстов, сгенерированных шаблонами, функциями синтаксического анализатора и переменными. Всякий раз, когда синтаксический анализатор получает указание от исходного кода страницы развернуть шаблон и т. Д. (То есть заменить его включением или заменой), синтаксический анализатор складывает длину расширенного викитекста, сгенерированного шаблоном и т. Д., И текущую значение счетчика страницы. Если эта сумма превышает лимит после расширения(то же самое, что и ограничение максимального размера статьи), исходный шаблон и т. д. не заменяется, а в выходной HTML-код добавляется сообщение об ошибке в виде комментария. В противном случае счетчик после расширения увеличивается до нового значения, и анализ продолжается. Шаблон, который более одного раза раскрывается на странице, влияет на размер его включения после развертывания более одного раза.

Вызов шаблонов без аргументов имеет расширенный текстовый кеш. Таким образом, если {{foo}}включает мета-шаблон второго уровня {{bar}}, то многократные вызовы {{foo}}будут только увеличивать размер включения после расширения для полностью развернутого {{foo}}; вторичное включение {{bar}}засчитывается только один раз. Но если вы включили один и тот же шаблон несколько раз с {{foo|arg}}, то вторичные шаблоны учитываются каждый раз, даже если аргумент тот же самый.

Страницы, превышающие предельный размер включения после развертывания, автоматически добавляются в Категория: Страницы, где превышен размер включаемого шаблона ( недавние добавления ).Шаблон: Цитаты, нарушенные пределом PEIS, могут быть вручную добавлены на страницу, если ссылки или шаблоны нарушены в результате проблемы.

Использование комментариев, noinclude и onlyinclude

Только данные, оставшиеся после стадии расширения препроцессора, засчитываются в счетчике после расширения. Длина HTML-комментариев в викитексте (которые не воспроизводятся в созданном исходном HTML-коде) не включается в счетчик после расширения. Код, который находится либо внутри раздела <noinclude>, либо вне раздела <onlyinclude>, не расширяется, поэтому эти разделы не влияют на размер после расширения. Это также означает, что теги категорий вносят вклад только в том случае, если они включены (для категоризации страниц, вызывающих шаблон).

Вложенные включения

Обратите внимание, что размеры викитекстов всех расширенных шаблонов и функций синтаксического анализатора добавляются даже в случае вложенности (см. Bugzilla 13260 ), поэтому дополнительные уровни увеличивают количество. Если страница A включает B, а B не делает ничего, кроме включения C, то размер C будет учитываться дважды по отношению к размеру включения после расширения на странице A, и аналогично, если шаблон состоит из вызова функции синтаксического анализатора или функция синтаксического анализатора имеет вызов шаблона в качестве параметра и т. д. Иногда это можно смягчить, разрешив функции синтаксического анализатора выдавать имя шаблона вместо результата шаблона, например, заменив

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

с участием

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

Необработанные включения

Необработанные трансляции по-прежнему учитываются при подсчете лимита. Например, страница, которая содержит только, {{#if:{{:Main Page}}}}все равно будет иметь размер включения после развертывания, даже если у нее вообще не будет вывода.

То же самое и с модулями Scribunto . Например, {{#invoke:Test|main}}все равно увеличился бы размер включения после развертывания, даже если бы Module: Test был просто:

мв . getCurrentFrame (): preprocess '{{msgnw :: Main Page}}' - удалите эту строку, и размер включения после расширения станет нулевым return  { main  =  function () end } - p.main () не имеет возвращаемого значения

Размер аргумента шаблона

Размер аргумент шаблона счетчик отслеживает общую длину аргументов шаблона , которые были замещены. Его ограничение такое же, как ограничение на размер статьи.

Пример:

{{3x|{{2x|abcde}}}}имеет размер аргумента шаблона 40 байт: аргумент abcdeabcdeсчитается 3 раза, аргумент - abcdeдважды.

Аргументы в вызове шаблона, которые не соответствуют ни одному тегу параметра в шаблоне, не учитываются.

Если шаблон содержит переключатель, использование аргументов шаблона вне совпадения не учитывается. До соответствующего случая включительно аргументы шаблона, используемые слева от знаков равенства, учитываются дважды. Те, которые находятся справа от знака равенства, учитываются только для случая совпадения.

Страницы, превышающие предел размера аргумента шаблона, автоматически добавляются в Категория: Страницы, содержащие пропущенные аргументы шаблона ( недавние добавления ).

Наивысшая глубина расширения

Страницы, превышающие этот предел, автоматически попадают в категорию « Категория: страницы, глубина раскрытия которых превышена ( недавние добавления )».

Дорогие вызовы функций парсера

Ярлык
  • WP: ДОРОГОЙ

Существует ограничение в 500 на количество дорогостоящих функций синтаксического анализатора , т. Е. На количество вызовов дорогостоящих функций синтаксического анализатора , а именно:

  • #ifexist - ветвление в зависимости от того, существует ли конкретная страница. Если предел этого счетчика превышен, дополнительные вызовы #ifexist будут действовать так, как будто запрашиваемые ими страницы не существуют.
  • PAGESINCATEGORY или PAGESINCAT
  • РАЗМЕР СТРАНИЦЫ
  • КАСКАДИНГСУРСЫ
  • REVISIONUSER, при использовании на странице, отличной от текущей.
  • REVISIONTIMESTAMP, при использовании на странице, отличной от текущей.
  • Некоторые функции Lua , многие из которых эквивалентны другим элементам в этом списке:
    • mw.site.stats.pagesInCategory
    • Некоторые свойства и методы титровального объекта

Также можно вручную увеличить количество дорогостоящих функций синтаксического анализатора из модуля Lua, используя mw.incrementExicingFunctionCount .

Страницы, превышающие этот предел, автоматически попадают в категорию « Категория: страницы со слишком большим количеством дорогостоящих вызовов функций парсера ( недавние добавления ).

См. Также: mw: Manual: $ wgExhibitedParserFunctionLimit , Шаблон: Дорогой

#время

Общая длина строк формата функции #timeограничена 6000 символами [1] . MediaWiki сообщает об ошибке : Pfunc time too long ). Для каждой комбинации расширенного викитекста строки формата и расширенного викитекста выражения для времени (например, «1 марта 2008 г. - 1 день») повторное использование не учитывается, так как результаты кэшируются.

К сожалению, этого количества нет в отчете о лимитах.

Special: Expandtemplates

Когда страница выходит за пределы, один из грубых способов решить проблему - использовать Special: ExpandTemplates . В отличие от подстановки, он рекурсивно расширяет сразу все уровни, без необходимости специально подготавливать шаблоны с кодом {{{|safesubst:}}}или подобным (см. Ошибку 2777 ). Это уменьшает все счетчики до нуля, за исключением числа узлов препроцессора, но даже оно обычно уменьшается до числа, которое находится в пределах лимита.

История

Ограничения включения были введены в действие в английской Википедии Тимом Старлингом 14 августа 2006 года. Новый препроцессор был включен в январе 2008 года, удалив «ограничение включения предварительного расширения» и заменив его ограничением «количества узлов препроцессора».

Практика использования страницы документации шаблона, хотя она может быть полезна по другим причинам, больше не нужна, чтобы избежать учета документации на страницах, вызывающих шаблон.

Рекомендации

  • Техническая информация о деревенском насосе (обсуждение теперь перенесено в Обсуждение в Википедии: ограничения шаблона )
  • Сообщение Тима в wikipedia-l
  • mw: отчет парсера NewPP