Jump to content

Erweiterung:Missbrauchsfilter/Bedingungen

From mediawiki.org
This page is a translated version of the page Extension:AbuseFilter/Conditions and the translation is 100% complete.

Essay: Der Bedingungsbegrenzer ist ein etwas improvisiertes Werkzeug zur Vermeidung von Leistungsproblemen. Sofern du dich um die Leistung sorgen möchtest, sind AusfĂŒhrungszeiten im Allgemeinen ein besserer Maßstab, ĂŒber den du nachdenken solltest. Die Zeiten und die Bedingungszahlen pro Filter sind etwas fehlerhaft (Wettlaufsituationen können dazu fĂŒhren, dass sie falsch sind), aber die meiste Zeit sollten sie gut genug sein, um sich darauf zu verlassen.

Die Bedingungsgrenze verfolgt (mehr oder weniger) die Anzahl der Vergleichsoperatoren + Anzahl der eingegebenen Funktionsaufrufe. Sie ist jedoch auch intelligent genug, um Funktionen und Klammergruppen zu umgehen, wenn der Wert keine Rolle spielt. Beispielsweise werden im Ausdruck A & B die Details von B nur ausgewertet, wenn A wahr ist. Aus diesem Grund ist es fĂŒr die Leistung von Vorteil, einfache einschrĂ€nkende Bedingungen, z. B. PrĂŒfungen auf Artikel-NamesrĂ€ume, vor komplexere AusdrĂŒcke zu setzen. Schließlich ist zu beachten, dass Funktionsaufrufe zwischengespeichert werden, sodass sie nur dann zur Bedingungsanzahl hinzugefĂŒgt werden, wenn zum ersten Mal ein bestimmtes Funktionsergebnis angefordert wird.

MediaWiki 1.27 und neuer

Praktische RatschlÀge

  • Platziere die Bedingungen, die leicht auszuwerten, aber schwer abzugleichen sind, am Anfang eines Filters. Dadurch wird der Abgleich mit dem Filter so schnell wie möglich abgeschlossen, was die Laufzeiten verbessert und die Verwendung von Bedingungen reduziert.
  • Wenn du nach dem Vorkommen mehrerer Zeichenketten in einem Text suchst (was bei Filtern zur Spam-Erkennung hĂ€ufig vorkommt), ist es viel schneller, contains_any(text, 'a', 'b', 'c') oder text rlike 'a|b|c' zu verwenden, als einen separaten Test fĂŒr jede Zeichenkette ('a' in text | 'b' in text | 'c' in text). Außerdem werden dabei weniger Bedingungen verbraucht.
  • Alle user_*-Variablen außer user_name erfordern möglicherweise eine Datenbankabfrage. Ihre Verwendung ist also aufwĂ€ndiger als die von vorkalkulierten Variablen wie action und page_namespace. Sie sollten möglichst nicht als erste Bedingung eines Filters verwendet werden. (Dies kann die Anzahl der Bedingungen verringern oder erhöhen, je nachdem, ob die Übereinstimmung aufgrund der neuen Reihenfolge frĂŒher oder spĂ€ter erfolgt. Die tatsĂ€chliche Leistung sollte sich dadurch jedoch verbessern.)

Allgemeine ZĂ€hlung

ZĂ€hlung von Bedingungen
Regeln verbrauchte Bedingungen Anmerkungen
'foo' == 'bar' 1 Ein einfacher Test zÀhlt als eine Bedingung.
'foo' == 'bar' | 'baz' == 'qaz' 2
'foo' == 'bar' & 'baz' == 'qaz' 1 Tests werden nicht gezĂ€hlt, wenn sie zur Ermittlung des Ergebnisses nicht ausgewertet werden mĂŒssen (Kurzschlussauswertung).
  • Im ersten Beispiel ist 'foo' == 'bar' falsch, weshalb das Gesamtergebnis unabhĂ€ngig vom zweiten Test ebenfalls falsch ist.
  • Im zweiten Beispiel ist 'foo' == 'foo' wahr, weshalb das Gesamtergebnis unabhĂ€ngig vom zweiten Test ebenfalls wahr ist.
'foo' == 'foo' | 'baz' == 'qaz' 1
str_replace( 'FooFoo', 'Foo', '' ) == 'bar' 2 Jeder Funktionsaufruf zÀhlt ebenfalls als eine Bedingung.
str_replace( 'FooFoo', 'Foo', '' ) == 'bar'
| str_replace( 'FooFoo', 'Foo', '' ) == 'baz'
3 Wiederholte Funktionsaufrufe mit identischen Argumenten werden nur einmal gezÀhlt.

Beispiel 1

Als praktisches Beispiel betrachten wir Filter 59 aus der englischsprachigen Wikipedia:

page_namespace == 6
& !("autoconfirmed" in user_groups)
& !(user_name in page_recent_contributors)
& rcount ("\{\{.*\}\}", removed_lines) > rcount ("\{\{.*\}\}", added_lines)

Dies kann vereinfacht werden zu:

A & !B & !C & fun1() > fun2()

AbhÀngig von den Werten der Variablen kann der Filter 1 bis 6 Bedingungen verbrauchen:

  • 1 Bedingung (1 Vergleich) wenn der erste Test falsch ist — die restlichen Tests werden nicht ausgewertet
  • 2 Bedingungen (2 Vergleiche) wenn der erste Test wahr ist, der zweite jedoch falsch — die restlichen Tests werden nicht ausgewertet
  • 3 Bedingungen (3 Vergleiche) wenn der erste und zweite Test wahr sind, der dritte jedoch falsch — die restlichen Tests werden nicht ausgewertet
  • 6 Bedingungen (3 Vergleiche + 2 Funktionsaufrufe + 1 Vergleich) wenn der erste, zweite und dritte Test wahr sind.

Wenn die erste Bedingung selten zutrifft, wie es bei page_namespace == 6 wahrscheinlich der Fall ist, verbraucht der Filter in den meisten DurchlÀufen nur eine Bedingung.

Vor MediaWiki 1.27