Программное обеспечение MediaWiki , на котором работает Wikipedia, имеет несколько параметров, ограничивающих сложность страницы и объем данных, которые могут быть включены. Эти ограничения в основном касаются данных, которые транслируются или заменяются во время расширения страницы, в отличие от данных непосредственно в источнике самой страницы. На этой странице объясняется, как и почему применяются эти ограничения, и как пользователи могут работать в рамках этих ограничений.
Программное обеспечение MediaWiki , которое генерирует HTML страницы из своего вики-источника, использует парсер для работы с включенными данными. Это делается с помощью «препроцессора», который преобразует вики-текст в структуру данных , известную как XML-дерево, а затем использует это дерево для создания «расширенного» вики-текста, где структуры с двойными и тройными фигурными скобками заменяются их результатом.
В процессе преобразования программное обеспечение использует несколько счетчиков для отслеживания сложности генерируемой страницы. Когда начинается разбор страницы, эти счетчики устанавливаются на ноль, но они увеличиваются в процессе разбора, как описано ниже. Существуют верхние пределы для этих счетчиков, и парсер не позволяет превышать эти пределы.
Очень длинные или сложные страницы медленно обрабатываются . Это не только неудобно для пользователей, но и может быть использовано для организации атаки типа «отказ в обслуживании» (DoS) на серверы, при которой запрос страницы заставляет программное обеспечение MediaWiki обрабатывать необоснованно большой объем данных. Ограничения помогают предотвратить этот тип атак и гарантировать, что страницы будут отображаться в разумные сроки. (Тем не менее, иногда сложная страница в пределах ограничений выдает ошибку тайм-аута; это зависит от того, насколько загружены серверы.)
Когда страница достигает ограничений шаблона, наиболее распространенным решением является сокращение шаблонов с помощью методов, описанных ниже. Если это невозможно, может потребоваться включить больше данных непосредственно в исходный код страницы, а не транслировать их из шаблонов (например, форматируя ссылки вручную или используя <references />
вместо {{ Reflist }} ). С другой стороны, шаблон может помочь серверу избежать выполнения дублирующей работы, см. ниже.
Лимиты включения чаще всего достигаются на страницах, которые используют один и тот же шаблон много раз, например, используя одно включение на строку длинной таблицы. Несмотря на то, что объем данных, которые шаблон добавляет на конечную страницу, может быть небольшим, он учитывается каждый раз, когда шаблон используется, и поэтому предел может быть достигнут раньше, чем ожидалось. Страницы, которые включают только несколько десятков шаблонов, вряд ли превысят лимиты включения, если только эти шаблоны сами не включают много данных.
После обработки тела страницы в конец HTML-кода страницы добавляется HTML-комментарий с окончательными значениями различных счетчиков. Например, страница ВИЧ/СПИД (1 января 2024 г.) содержит следующий комментарий в своем сгенерированном HTML-источнике:
<!-- Отчет о лимите NewPP Проанализировано mw1416 Время кэширования: 20231227101515 Срок действия кэша: 2592000 Сокращенный срок действия: false Усложнения: [vary-revision-sha1, show-toc] Использование процессорного времени: 2,767 секунды Использование в реальном времени: 3,151 секунды Количество посещенных препроцессором узлов: 20971/1000000 Размер включения после расширения: 928915/2097152 байта Размер аргумента шаблона: 9264/2097152 байта Максимальная глубина расширения: 15/100 Количество дорогостоящих функций парсера: 51/500 Глубина рекурсии отмены: 1/20 Размер отмены после расширения: 1121339/5000000 байт Lua использование времени: 1,705/10,000 секунд Использование памяти Lua: 10566120/52428800 байт Профиль Lua: MediaWiki\Extension\Scribunto\Engines\LuaSandbox\LuaSandboxCallback::preprocess 180 мс 10,6% ? 160 мс 9,4% MediaWiki\Extension\Scribunto\Engines\LuaSandbox\LuaSandboxCallback::callParserFunction 140 мс 8,2% MediaWiki\Extension\Scribunto\Engines\LuaSandbox\LuaSandboxCallback::plain 140 мс 8,2% MediaWiki\Extension\Scribunto\En gines\LuaSandbox\LuaSandboxCallback::gsub 80 мс 4,7% MediaWiki\Extension\Scribunto\Engines\LuaSandbox\LuaSandboxCallback::find 80 мс 4,7% dataWrapper <mw.lua:672> 80 мс 4,7% select_one <Module:Citation/CS1/Utilities:426> 80 мс 4,7% recursiveClone <mwInit.lua:41> 80 мс 4,7% <mwInit.lua:41> 60 мс 3,5% [другие] 620 мс 36,5% Количество загруженных сущностей Wikibase: 0/400 -->
(Некоторые элементы могут отсутствовать в других вики, в зависимости от установленных расширений; например, элементы «Lua» добавляются с помощью Extension:Scribunto.)
Из-за способа увеличения счетчиков количество посещенных препроцессором узлов, размер включений после расширения и размер аргумента шаблона обычно будут меньше своих пределов. Если какой-либо из этих элементов близок к своему пределу, то, скорее всего, некоторые шаблоны не были развернуты. Каждое появление неразвернутого шаблона идентифицируется в теле страницы HTML-комментарием, содержащим сообщение об ошибке.
Нажмите «Данные профилирования парсера» в нижней части предварительного просмотра, чтобы увидеть аналогичные данные для предварительного просмотра, не сохраняя его.
Шаблоны в невыполненных ветвях условных функций синтаксического анализатора не раскрываются и, следовательно, не учитываются. Например, в коде {{#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, могут быть вручную добавлены на страницу, когда цитаты или шаблоны были нарушены в результате проблемы. См. также phab:T189108.
Только данные, пережившие стадию расширения препроцессора, учитываются в счетчике пост-расширения. Длина комментариев HTML в викитексте (которые не воспроизводятся в созданном исходном HTML-коде) не включается в счетчик пост-расширения. Код, который находится либо внутри раздела <noinclude>, либо вне раздела <onlyinclude>, не расширяется, поэтому эти разделы не вносят вклад в размер пост-расширения. Это также означает, что теги категорий вносят вклад только в том случае, если они включены (для категоризации страниц, вызывающих шаблон).
Обратите внимание, что размеры викитекстов всех расширенных шаблонов и функций парсера добавляются, даже в случае вложенности (см. phab:T15260), поэтому дополнительные уровни увеличивают счет. Если страница A включает B, а B не делает ничего, кроме включения C, то размер C будет учитываться дважды в размере включения после расширения на странице A, и аналогично, если шаблон состоит из вызова функции парсера или функция парсера имеет вызов шаблона в качестве параметра и т. д. Возможные замены для уменьшения вложенности включают:
{{#if:{{{test|}}}|{{template1}}|{{template2}} }}
заменено на {{ {{#if:{{{test|}}}|template1|template2}} }}
.{{episode table|dontclose=y}} ...</table>
Неотрисованные трансляции все равно учитываются в лимите. Например, страница, которая содержит только , {{#if:{{:Main Page}}}}
все равно будет иметь размер включения после расширения, даже если у нее вообще не будет вывода.
То же самое относится к модулям Scribunto . Например, {{#invoke:Test|main}}
размер включения после расширения все равно увеличится, даже если Module:Test будет просто:
mw . getCurrentFrame (): предварительная обработка '{{msgnw::Main Page}}' -- удалите эту строку, и размер включения после расширения станет нулевым return { main = function () end } -- p.main() не имеет возвращаемого значения
Некоторые шаблоны имеют эквивалентные модули Lua, которые могут быть включены с помощью синтаксиса . Это имеет более низкий PEIS, чем использование шаблонов, которые обертывают этот модуль Lua. Однако, если использовать его непосредственно в статьях, это влияет на читаемость (и редактирование) исходного кода статьи, поэтому это не рекомендуется, если только это не является строго необходимым. К ним относятся:#invoke:module name
Страницы могут превысить лимит при попытке отобразить ссылки с помощью шаблона {{ reflist }} . Замена его на <references />
может позволить ссылкам отображаться, хотя список может быть обрезан, если лимит превышен такими шаблонами, как {{ cite web }} . С 2010 года тег имеет тот же стиль шрифта, что и {{ reflist }} , а с 2017 года он позволяет использовать адаптивные столбцы.
В идеале длина статей будет определяться решениями, связанными с содержанием, а не техническими проблемами. Однако, если проблемы PEIS неразрешимы для статьи, такой как длинный список, ее можно разделить на разделы, каждый из которых будет соответствовать лимиту, следуя политике WP :SPLIT .
Счетчик размера аргумента шаблона отслеживает общую длину аргументов шаблона, которые были заменены. Его предел такой же, как предел размера статьи .
Пример:
{{3x|{{2x|abcde}}}}
имеет размер аргумента шаблона 40 байт: аргумент abcdeabcde
учитывается 3 раза, аргумент — abcde
дважды.
Аргументы в вызове шаблона, которые не соответствуют ни одному тегу параметров в шаблоне, не учитываются.
Если шаблон содержит переключатель, использование аргументов шаблона за пределами совпадения не учитывается. До случая совпадения включительно аргументы шаблона, используемые слева от знаков равенства, учитываются дважды. Аргументы справа от знака равенства учитываются только для случая совпадения.
Страницы, превышающие ограничение на размер аргументов шаблона, автоматически добавляются в категорию:Страницы, содержащие пропущенные аргументы шаблона (недавние добавления).
Страницы, превышающие этот лимит, автоматически попадают в категорию: Страницы, на которых превышена глубина расширения (недавние добавления).
Существует ограничение в 500 на количество дорогостоящих функций синтаксического анализатора , т.е. на количество вызовов дорогостоящих функций синтаксического анализатора, которые:
Также можно вручную увеличить счетчик дорогостоящих функций парсера из модуля Lua с помощью mw.incrementExpensiveFunctionCount.
Страницы, превышающие этот лимит, автоматически попадают в категорию: Страницы со слишком большим количеством дорогостоящих вызовов функций парсера (недавние добавления).
См. также: mw:Manual:$wgExpensiveParserFunctionLimit, Шаблон:Expensive
Счетчик размера unstrip после расширения отслеживает общее количество байтов, добавленных с помощью TemplateStyles ( <templatestyles />
сам тег учитывается в подсчете размера включения после расширения).
Общая длина строк формата функции #time
ограничена 6000 символами [1]. Сообщение об ошибке выдается MediaWiki:Pfunc time too long ). Для каждой комбинации расширенного викитекста строки формата и расширенного викитекста выражения для времени (например, "1 марта 2008 г. -1день") повторное использование не учитывается, так как результаты кэшируются.
К сожалению, количество не указано в отчете о лимитах.
Когда страница превышает лимиты, один из грубых способов решения проблемы — использовать Special:ExpandTemplates . В отличие от подстановки, он рекурсивно расширяет все уровни сразу, без необходимости специальной подготовки шаблонов с кодом safesubst:<noinclude/>
или чем-то подобным (см. ошибку 2777). Это сводит все счетчики к нулю, за исключением количества узлов препроцессора, но даже оно обычно будет сведено к числу, которое находится в пределах лимита.
Ограничения на включение были введены в действие в английской версии Википедии Тимом Старлингом 14 августа 2006 года. Новый препроцессор был включен в январе 2008 года, удалив «ограничение на включение до расширения» и заменив его ограничением на «количество узлов препроцессора».
Практика использования страницы документации шаблона, хотя она все еще может быть полезна по другим причинам, больше не нужна для того, чтобы избежать подсчета документации на страницах, вызывающих шаблон.