PHP: CMS Funktion für mod_rewrite zu langsam

Wie wir alle wissen (sollten) ändert mod_rewrite keine Links im Script. Damit auch die Links auf Deiner Page auf die neuen "Rewrited URLs" zeigen bedarf es der Anpassung im Code. Fragen und Probleme rund um's Coding werden hier diskutiert.

Moderator: Super-Mod

PHP: CMS Funktion für mod_rewrite zu langsam

Beitragvon Floezen » 21.02.2009 22:57

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
Floezen
.
.
 
Beiträge: 2
Registriert: 21.02.2009 22:42

Beitragvon Gumbo » 22.02.2009 14:15

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">
Markus Wulftange
Gumbo
Moderator
Moderator
 
Beiträge: 5019
Registriert: 07.01.2005 01:18
Wohnort: Trier

Beitragvon Floezen » 22.02.2009 15:20

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
Floezen
.
.
 
Beiträge: 2
Registriert: 21.02.2009 22:42


Zurück zu Programmierung & Scriptanpassung für mod_rewrite

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste

cron