Mod-Rewrite Leistungseinbußen

URLs umschreiben, umleiten, blocken oder sperren - all das und noch viel mehr kann mit mod_rewrite erreicht werden. Mit regulären Ausdrücken, Conditions und Rules stehst Du auf Kriegsfuss? mod_rewrite macht nicht das was Du willst, oder funktioniert gar nicht? hier bist Du richtig!

Moderatoren: Bob, Super-Mod

Mod-Rewrite Leistungseinbußen

Beitragvon BennyInside » 27.03.2008 16:35

Hallo,

wenn ich meine subjektives Empfinden mal nicht ignoriere, bin ich der Meinung das meine Seite langsamer geworden ist.

Hat dies etwas mit Mod-Rewrite zu tun ? Kann man die Rules sozusagen optimieren ? Wenn ja wie ?

Gruß
Benny
BennyInside
.
.
 
Beiträge: 21
Registriert: 03.02.2008 06:19

Beitragvon Gumbo » 27.03.2008 17:30

Das Modul macht hauptsächlich zwei unterschiedliche Operationen: reguläre Ausdrücke prüfen und Zugriffe auf das Dateisystem. Beide Operationen sind relativ rechenintensiv und sollten deswegen soweit wie möglich minimiert beziehungsweise optimiert werden.

Die Optimierung von regulären Ausdrücken ist relativ kompliziert – vor allem es zu erklären. Ich versuch es mal anhand eines einfachen Beispiels zu erläutern:

Es sollen drei Werte der Form „x/y/z“ gesucht werden. Mögliche Lösungen:
Code: Alles auswählen
# schlecht
^(.*)/(.*)/(.*)$
# besser
^(.+)/(.+)/(.+)$
# noch besser
^(.+?)/(.+?)/(.+?)$
# am besten
^([^/]+)/([^/]+)/([^/]+)$
Der Grund: die Quantoren „*“ und „+“ sind so genannte gierige Quantoren. Das heißt die von dem vorhergehende Ausdruck gefundene Übereinstimmung ist maximal.

An der Beispielzeichenkette „x/y/z“ und dem ersten Suchmuster verdeutlicht, bedeutet das, dass bei der Prüfung des ersten Teilausdrucks (das heißt bei der Auswertung von „^(.*)“) bereits „x/y/z“ gefunden wird. Danach kommt im RA das „/“ und das Backtracking beginnt. Das bedeutet, die vorhergehende Übereinstimmung wird Zeichen um Zeichen inkrementiert, bis schließlich der Teilausdruck „^(.*)/“ passt. Das ist bei „x/y/“ der Fall. Dann wird der nächste Teilausdruck hinzugenommen (also: „^(.*)/(.*)“). Hier wird wieder „x/y/z“ komplett gefunden. Der nächste Teilausdruck wird hinzugenommen (also: „^(.*)/(.*)/“). Keine weitere Übereinstimmung, also beginnt wieder das Backtracking, das schließtlich „x/y/“ findet. Dann wird der letzte Teilausdruck hinzugenommen (also: „^(.*)/(.*)/(.*)$“). Jetzt wird wieder „x/y/z“ gefunden, aber erst jetzt ist der gesamte reguläre Ausdruck verarbeitet und somit die endgültige Übereinstimmung gefunden.

Dieselbe Beispielzeichenkette mit dem letzten Suchmuster: Der erste Teilausdruck wird geprüft (also: „^([^/]+)“) und trifft auf „x“, da das nachfolgende Zeichen („/“) die Bedingung „[^/]“ nicht mehr erfüllt. Dann wird der nächste Teilausdruck hinzugenommen (also: „^([^/]+)/“), der auf „x/“ passt. Dann der nächste (also: „^([^/]+)/([^/]+)“), der wieder nur auf „x/y“ passt (Zeichenkettenanfangsmarke beachten). Und so weiter. Ein kostspieliges Backtracking ist hier nicht notwendig.


Nachtrag: Hier ist noch ein anschauliches Beispiel zum Thema Backtracking.
Markus Wulftange
Gumbo
Moderator
Moderator
 
Beiträge: 5019
Registriert: 07.01.2005 01:18
Wohnort: Trier


Zurück zu mod_rewrite

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast