Vikipedi:Şablon sınırlamaları

Vikipedi'nin kullandığı MediaWiki yazılımında bir sayfanın karmaşıklığını ve sayfa içine eklenebilecek olan veri miktarını sınırlayan çeşitli parametreleri vardır. Bu sınırlar sayfanın kaynağında doğrudan yer alan veriler için değil sayfanın genişlemesi sırasında yansıtılan ya da yerine konarak gelen veriler için geçerlidir. Bu sayfa bu sınırların niçin ve nasıl uygulandığını ve kullanıcıların bu sınırlar içerisinde nasıl çalışabileceklerini açıklar.

Geçmişi

değiştir

Bu ne hakkında?

değiştir

Vikimetin kaynağından bir sayfanın HTML versiyonunu oluşturan MediaWiki yazılımı, dahil edilen verileri ele almak için bir ayrıştırıcı kullanır. Bu işlem vikimetni XML ağacı olarak bilinen veri yapısına çeviren ve daha sonra bu ağacı kullanarak "genişletilmiş" vikimetni üreten yani ikili ya da üçlü kaşlı ayraçlı yapıları sonuçları ile değiştiren bir "önişlemci" kullanılarak gerçekleştirilir.

Bu dönüşüm sürecinde, oluşturulan sayfanın karmaşıklığını izleyebilmek amacıyla yazılım çeşitli sayaçlar kullanır. Bir sayfanın ayrıştırılması başladığında bu sayaçlar sıfıra getirilir ve aşağıda belirtildiği gibi ayrıştırma süreci boyunca artırılarak ilerler. Bu sayaçların bir üst limiti vardır ve ayrıştırıcı bu üst limitlerin aşılmasına izin vermez.

Neden sınırlar var?

değiştir

Çok uzun ve karmaşık sayfaların ayrıştırılması yavaş olur. Bu yalnızca kullanıcılar için zorluk çıkarmanın ötesinde sunuculara bir sayfanın MediaWiki yazılımını aşırı derecede yüksek miktarda veriyi ayrıştırmasına zorlayarak Denial-of-service (DoS) saldırısı düzenlenmesinde kullanılabilir. Sınırlar bu tür saldırıları önlemek ve sayfaların makul bir sürede ayrıştırılabilmesini sağlamaya yardımcı olur. (Yine de sınırlar içinde olan karmaşık bir sayfa bazen zamanaşımı hatası verebilmektedir; bu sorun sunucuların ne kadar yoğun olduğu ile ilgilidir.)

Sınırlar içinde çalışmak

değiştir

Bir sayfa şablon sınırlarına ulaştığında en yaygın çözüm aşağıda belirtilen yöntemleri kullanarak şablonları kısaltmaktır. Eğer bu mümkün değilse şablonlardan yansıtmak yerine daha fazla veriyi doğrudan sayfa kaynağı içine eklemek gerekli olabilir (örneğin, kaynakları manuel olarak biçimlendirmek ya da {{Kaynakça}} yerine <references /> kullanmak gibi). Öte yandan ise bir şablon sunucuya mükerrer işlerin yaptırılmasını da engelleyebilir, lütfen aşağıya bakınız.

Sorunlar ne zaman ortaya çıkar?

değiştir

İçerme sınırlarına en yaygın olarak aynı şablonu çok tekrarlı olarak kullanan, örneğin uzun bir tablonun her satırı için bir şablon yansıtma kullanan sayfalarda ulaşılır. Şablonun hedef sayfaya eklediği veri miktarı az olsa bile şablon her kullanıldığında sayılacağı için sınırlara beklendiğinden daha erken ulaşılabilir. Yalnızca birkaç düzine şablon içeren sayfalar, o şablonların kendileri çok fazla veri içermiyorsa eğer içerme sınırlarına ulaşmaları pek muhtemel değildir.

Sorun olduğunu nasıl öğrenebilirsiniz?

değiştir

Bir sayfa gövdesi işlemden geçirildiğinde çeşitli sayaçların son değerlerini içeren bir HTML comment kodun sonlarına doğru eklenir. Örneğin 2010 FIFA Dünya Kupası sayfası (24 Temmuz 2020'de) oluşturulan HTML kaynak sayfasında aşağıdaki comment kodunu içerir:

<!-- 
NewPP limit report
...
Preprocessor visited node count: 54944/1000000
Post‐expand include size: 550841/2097152 bytes
Template argument size: 255979/2097152 bytes
Highest expansion depth: 26/40
Expensive parser function count: 3/500
Unstrip recursion depth: 0/20
Unstrip post‐expand size: 17190/5000000 bytes
Lua time usage: 0.347/10.000 seconds
Lua memory usage: 4.46 MB/50 MB
Number of Wikibase entities loaded: 1/400
-->

Sayaçların artırılma yöntemi nedeniyle ilk üç sayaç genellikle sınırlardan düşüktür. Eğer bunlardan birinin boyutları sınırlara yakınsa büyük bir olasılıkla şablonların bazıları genişletilmemiştir. Genişletilmemiş her şablon sayfa gövdesi içinde bir hata mesajı içeren HTML comment kodu ile belirtilir.

Benzer bir veriyi sayfayı kaydetmeden önce önizleme yaparken sayfanın en altında yer alan "Ayrıştırıcı profil verileri:" satırını tıklayarak da görebilirsiniz.

Genişletme

değiştir

Koşullu ayrıştırıcı işlevlerinin komut gönderilmeyen dallarındaki şablonlar genişletilmediği için sayaçla sayılmazlar. Örneğin {{#if:yes|{{bar}}|{{tın}}}} kodunda {{bar}} şablonu genişletilirken {{tın}} şablonu genişletilmez. Yine de son çıktıda görünmese bile bazı şablon argümanlarının sayaçlarla sayılması mümkündür. Örneğin {{#if:{{tın}}|yes|no}} kodu ayrıştırılırsa {{tın}} şablonunun genişletilmiş versiyonunun uzunluğu genişletme sonrası sayaca eklenecektir, çünkü koşulun hangi dalının seçileceğine karar vermek için öncelikle şablonun genişletilmesi gerekmektedir.

Önişlemci düğümü ziyaret sayısı

değiştir

Önişlemci düğümü ziyaret sayısı (İngilizce: preprocessor visited node count) sayfanın içindeki verinin hacmini değil karmaşıklığını ölçer. Ayrıştırıcı sayfayı genişletirken, sayfanın HTML yapısına karşılık gelen ve ağaç olarak bilinen bir veri yapısı oluşturur. Genişletme sırasında ziyeret edilen bu ağacın her düğümü önişlemci düğümü ziyaret sayısı sayacını artırır. Eğer bu sayacın sınırı aşılırsa ayrıştırıcı oluşturulan HTML kodunda "Node-count limit exceeded" (Düğüm ziyaret sayacı sınırı aşıldı) hatası olarak görülen mesajla birlikte ayrıştırma işlemini durdurur.

Sayaç düz metin için 1 ile başlar. Bir çift nowiki etiketi 3 sayılır, bir başlık iki sayılır, vb. İç bağlantı sayaçta sayılmaz. #switch kodunun genişletilmesinde kontrol edilen her koşul sayaca 2 ekler. Aynı şablonun çoklu genişletmelerinde argümanı olmayan şablonlar yalnızca bir kere sayılır ama argümanı olan şablonlar, argümanları sabit olsa bile her defasında sayılır. Buna karşın bir genişletmenin sonucu çoklu olarak kullanılsa bile, eğer bu sonuç bir şablon parametresine atandıysa ve şablon da o parametreyi çoklu olarak kullansa da yalnızca bir kere sayılır.

Bu sınırı aşan sayfalar otomatik olarak Kategori:Düğüm sayısı aşılan sayfalar kategorisine eklenir.

Genişletme sonrası içerme boyutu

değiştir

Genişletme sonrası içerme boyutu (İngilizce: post-expand include size) şablonlar, ayrıştırıcı işlevleri ve değişkenler tarafından oluşturulan genişletilmiş vikimetinlerin uzunluğunun toplamıdır. Bir sayfanın kaynak kodu tarafından ayrıştırıcıya bir şablonu genişletme komutu verildiğinde yani şablonu yansıtma ya da yerine koyma işlemiyle değiştirdiğinde ayrıştırıcı şablon tarafından oluşturulan vikimetnin uzunluğunu toplar ve sayfanın güncel sayaç değerine ekler. Eğer bu toplam genişletme sonrası sınırdan (maksimum madde boyutu ile aynıdır) fazla ise şablonun yansıtma ya da yerine koyma işlevi yapılmaz ve HTML çıktısına bir hata mesajı comment olarak eklenir. Eğer sınır aşılmıyorsa genişletme sonrası sayaç yeni değere getirilir ve ayrıştırma devam eder. Sayfada birden fazla genişletilen şablon genişletme sonrası içerme boyutuna birden fazla olarak eklenir.

Argümanı olmayan şablon çağırmalarının genişletilmiş metin önbelleği vardır. Örneğin {{tın}} şablonu ikinci düzey meta-şablon {{bar}}'ı içeriyorsa, {{tın}} şablonunun çoklu çağrıları genişletme sonrası içerme boyutunu yalnızca tamamen genişletilmiş {{tın}} şablonu için artıracak ve ikincil {{bar}} şablonu yalnızca bir kere sayılacaktır. Ama aynı şablonu {{tın|arg}} olarak birden çok kere eklediyseniz o zaman argümanlar aynı olsa bile ikincil şablonlar her seferinde sayılacaktır.

Genişletme sonrası içerme boyutu sınırını aşan sayfalar otomatik olarak Kategori:Şablon içerme büyüklüğü sınırı aşılan sayfalar kategorisine eklenir.

Comment, noinclude ve onlyinclude kullanımı

değiştir

Yalnızca önişlemci genişletme etabını geçen veriler genişletme sonrası sayacında dikkate alınır. Vikimetin içinde bulunan HTML commentlerinin uzunluğu genişleme sonrası sayacına eklenmez. <noinclude> bölümünün içinde kalan ya da <onlyinclude> dışında kalan kod genişletilmez dolayısıyla bu bölümler de genişltme sonrası sayacına eklenmez. Yani kategori etiketleri eğer şablonu kullanan sayfaları kategorilendirmek için eklenmişse genişletme sonrası sayaçta sayılırlar, değilse sayılmazlar.

İçiçe yansıtmalar

değiştir

Tüm genişletilen şablonların ve ayrıştırıcı işlevlerinin, içiçe geçme durumunda bile (bkz. bugzilla 13260) vikimetin boyutlarının toplandığına dikkat ediniz; dolayısıyla fazladan düzeyler sayacı artırır. Eğer A sayfası B sayfasını yansıtırsa ve B sayfası C sayfasını yansıtmaktan başka bir şey yapmıyorsa o zaman C sayfasını boyutu A sayfasının genişletme sonrası içerme boyutu sayacında iki kere sayılacaktır; benzer şekilde bir şablon bir ayrıştırıcı işlev çağrısı içeriyorsa ya da bir ayrıştırıcı işlevi parametre olarak şablon çağrısına sahipse de aynı şekilde sayaç için dikkate alınır. Bunun hafifletilmesi için bazen ayrıştırıcı işlevinin şablon sonucu yerine şablon adı oluşturmasına izin verilerek mümkün olabilir; örneğin

{{#if:{{{sınama|}}}|{{şablon1}}|{{şablon2}} }}

kodu yerine

{{ {{#if:{{{sınama|}}}|şablon1|şablon2}} }}

kodu kullanılabilir.

İşlenmeyen yansıtmalar

değiştir

İşlenmeyen yansıtmalar da sayaca dahil edilir. Örneğin, yalnızca {{#if:{{:Anasayfa}}}} kodu taşıyan bir sayfa, bunun hiçbir çıktısı olmasa bile genişletme sonrası içerme boyutuna eklenir.

Aynı durum Scribunto modülleri için de geçerlidir. Örneğin, {{#invoke:Sınama|ana}} kodu,

Modül:Sınama yalnızca:

mw.getCurrentFrame():preprocess'{{msgnw::Anasayfa}}'-- bu satırı kaldırırsanız genişletme sonrası içerme boyutu sıfır olur
return {ana = function()end}-- p.ana()'nın döndürülen değeri yoktur

kodundan oluşsa bile genişletme sonrası içerme boyutu için sayaca eklenir.

Şablon argüman boyutu

değiştir

Şablon argüman boyutu (İngilizce: template argument size) sayacı yerleştirilen şablon argümanlarının toplam uzunluğunu sayar. Sınırı madde boyutu sınırı ile aynıdır.

Örneğin:

{{3x|{{2x|abcde}}}} kodunun şablon argüman boyutu 40 byte'tır: {{2x|abcde}} argümanı 3 kere sayılırken, abcde argümanı iki kere sayılır.

Şablon çağırmasında bulunan ama şablonun hiçbir parametre etiketine uymayan argümanlar sayılmaz.

Eğer bir şablonda switch varsa eşleştirme yapıldıktan sonraki şablon argümanları sayılmaz. Eşleştirme dahil olmak üzere, eşleştirmeye kadar olan, eşit işaretinin solunda kullanılan şablon argümanları ise iki kere sayılır. Eşit işaretinin sağındakiler ise yalnızca eşleştirme yapılan durum için sayılır.

Şablon argüman boyutunu geçen sayfalar otomatik olarak Kategori:Geçersiz şablon değiştirgenleri içeren sayfalar kategorisine eklenir.

En yüksek genişleme derinliği

değiştir

Bu sınırı aşan sayfalar otomatik olarak Kategori:Genişleme derinliği aşılan sayfalar kategorisine eklenir.

Pahalı ayrıştırıcı işlevleri çağrıları

değiştir

Pahalı ayrıştırıcı işlev sayısı (İngilizce: expensive parser function count) yani pahalı ayrıştırıcı işlevleri çağrıları, 500 ile sınırlıdır. Bunlar şöyle sıralanır:

  • #ifexist – belirli bir sayfanın olup olmadığına bağlı dallanma. Eğer bu sayacın sınırı aşılırsa ek #ifexist çağrıları sanki o sayfalar yokmuş gibi çalışır.
  • PAGESINCATEGORY ya da PAGESINCAT
  • PAGESIZE
  • CASCADINGSOURCES
  • REVISIONUSER, güncel sayfa dışında başka bir sayfada kullanıldığında
  • REVISIONTIMESTAMP, güncel sayfa dışında başka bir sayfada kullanıldığında
  • Bazı Lua işlevleri, çoğu bu listedeki diğer ögelere eşdeğerdir:

Aynı zamanda mw.incrementExpensiveFunctionCount kullanarak bir Lua modülünden pahalı ayrıştırıcı işlev sayısını manuel olarak artırmak da mümkündür.

Bu sınırı aşan sayfalar otomatik olarak Kategori:Çok fazla zengin derleyici fonksiyonu çağrısına sahip sayfalar kategorisine eklenir.

Ayrıca bakınız: mw:Manual:$wgExpensiveParserFunctionLimit

#time işlevinin biçim dizilerini toplam uzunluğu 6000 karakter ile sınırlıdır[1]. Her biçim dizisinin genişletilmiş vikimetni ve zaman ifadesinin genişletilmiş metni (örneğin "1 Mar 2008 -1gün") kombinasyonu için tekrar edilen kullanımlar sayılmaz çünkü sonuçlar önbellektedir.

Maalesef bu sayaç sınır raporunda bulunmamaktadır.

Özel:ŞablonlarıGenişlet

değiştir

Bir sayfa sınırları aştığında bu sorunu çözmenin basit bir yolu Özel:ŞablonlarıGenişlet sayfasını kullanmaktır. Yerine koyma yönteminin aksine bu yöntem, şablonlarda özel olarak {{{|safesubst:}}} kodu ya da benzerlerini (bakınız bug 2777) kullanmak zorunda kalmadan tüm düzeyleri yinelemeli olarak bir kerede genişletir. Bu şekilde önişlemci düğüm ziyaret sayacı haricinde tüm sayaçları sıfırlar ama bu sayaç bile genel olarak sınır altında bir sayıya azalır.