Erweiterung:Missbrauchsfilter/Bedingungen

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