WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   str_replace zu langsam ... (http://www.wcm.at/forum/showthread.php?t=94216)

schera 15.04.2003 20:34

str_replace zu langsam ...
 
Hallo an alle php-freaks,
habe ein grosses Problem mit dem Ersetzen von Werten in einem Template.
Die Platzhalter im Template möchte ich mit Daten von der Datenbank (mySQL) ersetzen.

Code:

// Template öffnen
$tpl = opentpl($filename);

// Inhalt Parsen
while ($r_eintr = mysql_fetch_array($rs_eintr)) {

$out_eintr.= $tpl;

$out_eintr = str_replace({Wert1}, $r_eintr['wert1'], $out_eintr);
... hier kommen noch 6 Werte

}

Nach 30 Sekunden bekomme ich ein Execution Timeout ...
Lasse ich die str_replace Function weg, dann funktionierts einwandfrei.
Also liegts nicht an der DB ...
Gibts vielleicht eine bessere oder schnellere Lösung für das Ganze?

Danke für Eure Hilfe,

lG,

schera

sagi 15.04.2003 20:55

hallo.

versuch mal folgendes:

1) vergiss $tpl

2) $out_eintr = file($filename);

3) $out_eintr = ereg_replace("{wert1}", $r_eintr['wert1'], $out_eintr); //beachte die Anführungszeichen und lies dir die Tips in der Doku: http://www.php.net/manual/de/function.str-replace.php

4) WICHTIG: echo $out_eintr; //falls es fehlen sollte.

mfg

c.

schera 15.04.2003 21:10

Zitat:

Original geschrieben von sagi
hallo.

versuch mal folgendes:

1) vergiss $tpl

2) $out_eintr = file($filename);

3) $out_eintr = ereg_replace("{wert1}", $r_eintr['wert1'], $out_eintr); //beachte die Anführungszeichen und lies dir die Tips in der Doku: http://www.php.net/manual/de/function.str-replace.php

4) WICHTIG: echo $out_eintr; //falls es fehlen sollte.

mfg

c.

Erstens danke für die schnelle Hilfe.

Weiters, wenn ich das Ganze mit

$out_eintrag = file($filename);

durchlaufe und mit ereg_replace mache, dann bekomme ich nur ein array zurück ... :confused:

Ich öffne mit der Funktion
$tpl = opentpl($filename)
nur das File mit fopen und speichere es in eine Variable.
Das muss ich auch machen, denn ansonsten kann ich die Daten nicht bearbeiten.
Weiters mit ereg_replace oder preg_replace ist es genauso langsam. :confused:
Oder habe ich da was falsch verstanden ... ?

sagi 15.04.2003 22:39

sorry. ich hab das mit dem Array nicht bedacht... bin schon etwas eingerostet

das sollte funken:

PHP-Code:

<?php

$array 
file("file");

foreach(
$array as $line) {
        
$file .= $line;
        }

$file ereg_replace("{sdf}""WERT"$file);

echo 
$file;

?>

hoffe es funkt.

mfg

c.

käptn 16.04.2003 10:20

Hi,

kann mir ehrlich gesagt nicht vorstellen, dass ereg_* schneller sein soll, als str_*

Normalerweise:

str_* < preg_* < ereg_*

Aber je länger der string, desto länger braucht str_*, deshalb ist bei meinem Beispiel auch preg_* am schnellsten.

Code:

str_replace: 0.025193929672241
preg_replace: 0.013223052024841
ereg_replace: 4.4316660165787

PHP-Code:

header("Content-Type: text/plain");
$str str_repeat('asdf asdf ß0312i23 jrff23 rfsae'10000);

$start explode(' 'microtime());
$start $start[0]+$start[1];
$str2 str_replace('23''xy'$str);
$end explode(' 'microtime());
$end $end[0]+$end[1];
echo 
'str_replace: '.($end-$start)."\n";

$start explode(' 'microtime());
$start $start[0]+$start[1];
$str3 preg_replace('/23/''xy'$str);
$end explode(' 'microtime());
$end $end[0]+$end[1];
echo 
'preg_replace: '.($end-$start)."\n";

$start explode(' 'microtime());
$start $start[0]+$start[1];
$str4 ereg_replace('23''xy'$str);
$end explode(' 'microtime());
$end $end[0]+$end[1];
echo 
'ereg_replace: '.($end-$start)."\n"

~

sagi 16.04.2003 16:53

Zitat:

Diese Funktion ersetzt alle Vorkommen von needle innerhalb der Zeichenkette haystack durch den String str. Falls Sie keine ausgefallenen String-Ersetzungen brauchen, sollten Sie immer dieser Funktion den Vorzug vor ereg_replace() geben.
laut php doc. Begründung fehlt. wenn du meune, link folgst (weiter oben) kommst du auch zu einer diskussion darüber. (hab ich allerdings nicht gelesen)

mfg

c

käptn 16.04.2003 18:05

q.e.d. :D

~

schera 16.04.2003 18:54

Zitat:

Original geschrieben von sagi
sorry. ich hab das mit dem Array nicht bedacht... bin schon etwas eingerostet

das sollte funken:

PHP-Code:

<?php

$array 
file("file");

foreach(
$array as $line) {
        
$file .= $line;
        }

$file ereg_replace("{sdf}""WERT"$file);

echo 
$file;

?>

hoffe es funkt.

mfg

c.

Danke für den Lösungsvorschlag ...
habe dies nun ausprobiert ... allerdings hilfts ned wirklich
Vielleicht ist es ein wenig schneller, aber immer noch viel zu langsam.

Daher kommt immer noch:
Maximum execution time of 30 seconds exceeded

Im Prinzip wenn ich 1000 Datensätze auslese und bei jeden Datensatz 7 x einen Replace mache, komme ich somit auf 7000 str_replace bzw. erreg_replace.

hab eine Funktion gefunden wo man im Script den Execution Timout auf 0 setzen kann, allerdings dauert dann das Ganze bis zu 2 Min.

Gibts vielleicht noch eine andere Möglichkeit einen Replace in einem Template zu machen ??

Danke und lG,

schera

käptn 16.04.2003 19:41

Sag nicht, du willst 1000 Datensätze anzeigen!? :rolleyes: ;)

Sei so gut und poste mal deinen Source.

~

schera 17.04.2003 14:27

hmm, denn ganzen code zu post wäre heftig.
Das Ganze läuft so ab, dass die index.php je nach gewollter Anzeige ein entsprechendes Template öffnet.
In diesem Template sollen nun die Datensätze angezeigt werden.
D.h. es gibt einmal das Designtemplate wo der Header der Tabelle ect. drinnen steht.
Dann gibt es noch ein Template wo das Design für eine Zeile der Tabelle drinnen ist.
So nun wird einmal das Design geöffnet und dann wird die einzelne Zeile geöffnet und die Daten von der DB ersetzt.
Wenn nun 1000 Datensätze angezeigt werden sollen, dann ersetzt er in einer Zeile 7 Felder im Template.
Zum Schluss wird alles gesamt ausgegeben.

Und ja ich möchte 1000 Datensätze anzeigen lassen ... da ich dann per Checkbox alle auswählen kann und danach einen Export fahren will.

D.h. z.B. ich will alle Daten die mit der PLZ 1000 beginnen und mit 1100 aufhören. Danach will ich per Checkbox bestimmte auswählen können und weiters exportieren in ein file zum weiterverarbeiten in einem Seriendokument.

puh ... das problem ist allerdings nicht das Handling, sondern das die Funktion str_replace ziemlich lange dauert bei mehreren Datensätze. Somit wollte ich mal nachfragen ob´s eine schneller Möglichkeit gibt Templates zu öffnen und darin Platzhalter zu ersetzen.

Hoffe, dass ich es einigermassen sinnvoll erklären konnte.

Danke für die Hilfe,

lG,

schera


Alle Zeitangaben in WEZ +2. Es ist jetzt 07:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag