Seite 1 von 1

PHP: CMS Funktion für mod_rewrite zu langsam

Verfasst: 21.02.2009 22:57
von Floezen
Hallo,

ich komme seit Monaten mit einem Problem nicht weiter:


Ich habe ein CMS und lasse mir meine URLs damit umschreiben.

Bisher sah die Funktion folgendermaßen aus:


Code: Alles auswählen

function rewrite_url(&$s) 
{     

$replace = array(

"'(?<!/)file.php\?name=Test(&amp;|&)op=View(&amp;|&)id=([0-9]*)(\"|\')'" => "test-\\3.html\\4",
"'(?<!/)file.php\?name=Download(&amp;|&)op=View(&amp;|&)id=([0-9]*)(\"|\')'" => "download-\\3.html\\4",

);

$in=array_keys($replace);
$out=array_values($replace);
$s = preg_replace($in, $out, $s);
return $s;
}


Die Funktion hat aber nur Links umgeschrieben, die nicht absolut waren:

<a href=\"file.php?...\">

Sobald die URL mit einem Slash anfing (<a href=\"/file.php?...\">), funktionierte die Funktion nicht mehr.
Oder wenn - z.B. für einen Newsletter - die Domain mit in dem Link war (<a href=\"http://www.example.com/file.php?...\">), funktionierte die Funktion auch nicht mehr.

Ich habe jetzt also versucht, diese Funktion soweit zu ändern, dass alle Links ausser den einer fremden Domain umgeschrieben wurden:

Code: Alles auswählen

function rewrite_url(&$s) 
{     
$rw = "(?<=href=\"/)|(?<!/)|(?<= example.com/)|(?<= example.de/)";

$replace = array(

"'($rw)file.php\?name=Test(&amp;|&)op=View(&amp;|&)id=([0-9]*)(\"|\')'" => "test-\\4.html\\5",
"'($rw)file.php\?name=Download(&amp;|&)op=View(&amp;|&)id=([0-9]*)(\"|\')'" => "download-\\4.html\\5",

);

$in=array_keys($replace);
$out=array_values($replace);
$s = preg_replace($in, $out, $s);
return $s;
}


So, das funktioniert so auch. Nur gibt es ein Problem:

Es ist verdammt langsam!!! Die Seiten brauchen jetzt 10x so lange!

Hat jemand einen Vorschlag, wie man das besser lösen kann?

Danke & Grüsse
Florian

Verfasst: 22.02.2009 14:15
von Gumbo
Statt die Links im Nachhinein zu suchen und zu verändern, schreib lieber ein Funktion, die das direkt für dich macht. Beispielsweise:

Code: Alles auswählen

echo '<a href="'.foobar('test-123.html').'">';
// oder
echo '<a href="'.foobar('file.php?name=Test&op=View&id=123').'">';
wird zu:

Code: Alles auswählen

<a href="test-123.html">
<!-- oder -->
<a href="file.php?name=Test&amp;op=View&amp;id=123">

Verfasst: 22.02.2009 15:20
von Floezen
Hmm, das ist langfristig vielleicht eine gute Idee, hat aber zwei Hacken:

1.) Ich weiß nicht genau wieviele hunderttausend Zeilen Quelltext ich momentan überarbeiten müsste...

2.) Alles muss PHP sein. reine HTML-Teile würden im Nachhinein nicht überarbeitet werden...

Gibt es vielleicht eine andere günstigere Art das im Nachhinein zu machen? ich meine, die ursprüngliche Funktion war so schnell, dass der Unterschied zu einer ausgeschalteten URL Überarbeitung kaum messbar war.

Wenn ich die Funktion z.B so überarbeite, dass auch Femddomains bearbeitet werden würden. Geht alles auch super schnell:

Code: Alles auswählen

function rewrite_url(&$s) 
{     

$replace = array(

"'file.php\?name=Test(&amp;|&)op=View(&amp;|&)id=([0-9]*)(\"|\')'" => "test-\\3.html\\4",
"'file.php\?name=Download(&amp;|&)op=View(&amp;|&)id=([0-9]*)(\"|\')'" => "download-\\3.html\\4",

);

$in=array_keys($replace);
$out=array_values($replace);
$s = preg_replace($in, $out, $s);
return $s;
}



Ich benötige eigentlich nur eine Möglichkeit Fremd-URLs auszuschließen.

Grüsse
Florian