Википедия:Пределы шаблоновВ MediaWiki есть несколько параметров, которые задают пределы сложности страниц и количества включаемой в страницу информации. Эти пределы касаются в основном той информации, которая включается в страницу через механизм раскрытия шаблонов или методом подстановки содержимого шаблонов во время формирования страницы, и почти не затрагивают те данные, которые содержатся в собственно загружаемой странице. На этой странице рассказывается, как работают и зачем нужны эти пределы, и что делать, чтобы не превышать их. СправкаЧто это?Движок MediaWiki, который генерирует итоговый HTML-код страницы на базе вики-текста, использует парсер для анализа включенных данных. Всё это происходит в «препроцессоре», который конвертирует вики-текст в структуру данных, подобную XML-дереву, а затем использует эту структуру для генерирования «раскрытого» вики-текста, в котором структуры из двойных и тройных скобок заменяются их результатом. В процессе преобразования движок использует несколько счётчиков, которые анализируют сложность генерирования страницы. Когда начинается синтаксический анализ (парсинг) страницы, эти счётчики устанавливаются в нуль, но в процессе анализа постепенно повышают свои значения, как это описано ниже. Каждый счётчик имеет верхний предел, при достижении которого парсер перестаёт обрабатывать тот тип данных, для которого предел превышен. Зачем нужны эти пределы?Слишком длинные и сложные страницы могут генерироваться значительное время. Кроме того, что этот недостаток может доставлять неудобства для пользователей, его можно использовать в качестве инструмента для DoS-атак на серверы, в ходе которых запросы к сложным страницам заставляют движок MediaWiki обрабатывать несоразмерно огромное количество данных. Эти пределы помогают предотвратить DoS-атаки и уменьшить время генерирования запрошенных страниц. Что делать, если пределы всё-таки превышены?Если страница всё-таки достигла пределов для шаблонов, наиболее приемлемым выходом является упрощение самих шаблонов, которого можно добиться используя изложенные ниже методы. Если это невозможно, альтернативным решением проблемы может быть внесение информации прямо в текст страницы, вместо включения этой информации из шаблона. С другой стороны, шаблоны могут, наоборот, избежать повторения парсером однообразных задач, об этом ниже. Когда проблема может возникнуть?Превышение пределов возможно на тех страницах, в которых многократно используются одни и те же шаблоны, например, по одному включению на каждую строку длинной таблицы. Несмотря на то, что сам шаблон может вносить в итоговую страницу незначительный объем данных, весь объём данных, используемый шаблоном, будет считаться при каждом его включении и, таким образом, предел счётчика может быть превышен ранее, чем можно ожидать. Страницы, которые включают лишь незначительное количество шаблонов, практически никогда не превышают эти пределы, исключением могут быть случаи, когда сами шаблоны содержат огромное количество данных. Как узнать, превышены ли пределы?При обработке страницы движком в HTML-код после основного содержимого страницы добавляется тег комментария mw:NewPP parser report, содержащий итоговые значения счетчиков. Например, статья Кошка (на момент 27 сентября 2023 года) содержит следующий комментарий в сгенерированном HTML-коде: <!--
NewPP limit report
...
Preprocessor visited node count: 69434/1000000
Post‐expand include size: 582688/2097152 bytes
Template argument size: 103820/2097152 bytes
Highest expansion depth: 23/100
Expensive parser function count: 39/500
...
Первые три счётчика обычно не превышают пределов. Когда значение счётчика близко к пределу, некоторые шаблоны могут быть проигнорированы парсером. Каждое вхождение нераскрытого шаблона отмечается в теле страницы как HTML-комментарий, содержащий сообщение об ошибке, например: <a href="/wiki/Шаблон:Foo" title="Шаблон:Foo">Шаблон:Foo</a><!-- WARNING: template omitted, post-expand include size too large -->
Включение шаблоновШаблоны в нераскрытых ветвях условных функций парсера не учитываются счётчиком. Например, в коде Тем не менее, аргумент шаблона может влиять на счётчик, даже если он не включён в итоговый результат. Например, если страница содержит Счётчик узлов препроцессораСчётчик узлов препроцессора (англ. preprocessor node count) определяет сложность страницы (но не объем данных). Во время анализа вики-текста парсер создает XML-подобную структуру данных, которую потом преобразует в HTML. Каждый узел этой структуры, затронутый при генерировании страницы, учитывается этим счётчиком. Если счётчик превысит предел, парсер прервет анализ страницы и выдаст ошибку «Node-count limit exceeded», видимую в итоговом HTML. Счётчик устанавливается в единицу, когда обрабатывается первый узел, предназначенный для обычного текста. Пара тегов <nowiki> считается за 3 узла, заголовок за 2 и т. п. Ссылки не влияют на этот счётчик. Для функции Размер раскрытых включенийСчётчик размера раскрытых включений (англ. post-expand include size) учитывает размер вики-текста, раскрытого из шаблонов, функций парсера и переменных. Каждый раз, когда парсер раскрывает на странице содержимое шаблона (включением или подстановкой), размер этого шаблона добавляется к текущему значению счётчика. Если полученная сумма превысила предел, оставшиеся шаблоны не раскрываются, и в HTML-код добавляется только имя шаблона и сообщение об ошибке При вызове шаблона без аргументов раскрытый текст шаблона кэшируется. Так, например, если в шаблон Страницы с превышением этого предела автоматически попадают в категорию Страницы, для которых превышен допустимый размер включаемых шаблонов. Комментарии, теги <noinclude> и <includeonly>Счётчик учитывает только те данные, которые препроцессор раскрывает при обработке шаблона. Таким образом, размер HTML-комментариев в вики-тексте не влияет на значение post-expand include size. Фрагменты кода, заключенные в теги <noinclude>, или находящиеся вне тегов <includeonly> также не раскрываются в итоговый текст и не учитываются счётчиком. То же касается и категорий — они учитываются счётчиком, только если включаются в итоговую статью (при категоризации шаблоном). Вложенные включенияСтоит отметить, что размер всех раскрытых шаблонов и функций парсера суммируется в том числе и при многократном вложении[1]. То есть, если страница A включает страницу B, а B в свою очередь не содержит ничего, но включает страницу C, размер страницы C будет учтён счётчиком дважды. Так же это касается случаев, когда шаблоном вызываются функции парсера или функции парсера вызывают другой шаблон в качестве своего параметра. Влияние на счётчик может быть уменьшено, если в функциях парсера использовать не включения шаблона, а только его имя, например:
заменить на
Размер аргументов шаблонаСчётчик размера аргументов шаблона (англ. template argument size) учитывает общий размер использованных аргументов шаблона. Например, конструкция Аргументы шаблона, которые не соответствуют ни одному из вызванных параметров шаблона, счётчиком не учитываются. Если шаблон содержит «переключатель» (англ. switch), аргументы шаблона, не совпадающие со значением оператора выбора (англ. case), также не учитываются счётчиком. Аргументы шаблона в левой части «переключателя», расположенные до совпадающего со значением оператора выбора включительно, учитываются счётчиком дважды, а аналогичные аргументы в правой части учитываются лишь единожды. Страницы, превышающие предельный размер аргументов шаблона, автоматически помещаются в категорию «Страницы, содержащие пропущенные аргументы шаблонов». Вызовы ресурсоёмких функций парсераВ данный момент пределом для счётчика ресурсоёмких функций парсера (англ. expensive parser function count) является значение 500. К ресурсоемким функциям парсера относят, например:
Страницы, превышающие этот предел, автоматически помещаются в категорию «Википедия:Страницы со слишком большим количеством вызовов ресурсоёмких функций». #timeОбщая длина строк функций времени К сожалению, значения этого счётчика не выводятся в служебный комментарий html-кода итоговой страницы. Когда страница превышает какой-либо предел, одним из вариантов решения проблемы может быть применение расширения Extension:ExpandTemplates, которое выполняется на служебной странице Expandtemplates. В отличие от подстановки шаблонов служебная страница рекурсивно раскрывает все уровни сразу без необходимости раскрывать шаблоны конструкциями вида ИсторияРазработчики движка добавили пределы шаблонов в 2006 году, сперва в английской Википедии. Новый препроцессор, введенный в январе 2008 года, заменил предел размера раскрываемых включений (англ. pre-expand include limit) на предел узлов препроцессора (англ. preprocessor node limit). Практика использования отдельных страниц документации для шаблонов, несмотря на возможную пользу по ряду иных причин, более не является обязательной для исключения документации из счётчиков на страницах, использующих шаблоны. ПримерыЕсли инициалы для авторов используются в шаблонах источников, например 500 книг/статей как примечания, использование шаблона {{nobr}} и мнемоники См. также
ПримечанияСсылки
|
Portal di Ensiklopedia Dunia