WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 15.04.2003, 20:34   #1
schera
Veteran
 
Registriert seit: 03.07.2000
Alter: 46
Beiträge: 430


Frage 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
schera ist offline   Mit Zitat antworten
Alt 15.04.2003, 20:55   #2
sagi
Elite
 
Registriert seit: 08.11.2001
Alter: 42
Beiträge: 1.285


Standard

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.
____________________________________
www.sagmueller.net

Freedom - use it or lose it (Lawrence Lessig)

Im übrigen bin ich der Meinung, dass Microsoft zerschlagen werden muss.
sagi ist offline   Mit Zitat antworten
Alt 15.04.2003, 21:10   #3
schera
Veteran
 
Registriert seit: 03.07.2000
Alter: 46
Beiträge: 430


Standard

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 ...

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.
Oder habe ich da was falsch verstanden ... ?
schera ist offline   Mit Zitat antworten
Alt 15.04.2003, 22:39   #4
sagi
Elite
 
Registriert seit: 08.11.2001
Alter: 42
Beiträge: 1.285


Standard

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.
____________________________________
www.sagmueller.net

Freedom - use it or lose it (Lawrence Lessig)

Im übrigen bin ich der Meinung, dass Microsoft zerschlagen werden muss.
sagi ist offline   Mit Zitat antworten
Alt 16.04.2003, 10:20   #5
käptn
Inventar
 
Registriert seit: 04.11.2001
Alter: 45
Beiträge: 2.150


Standard

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"
~
____________________________________
LOL - Mein erstes Post im Programmier Forum

MACINTOSH - Most Applications Crash, If Not The Operating System Hangs
käptn ist offline   Mit Zitat antworten
Alt 16.04.2003, 16:53   #6
sagi
Elite
 
Registriert seit: 08.11.2001
Alter: 42
Beiträge: 1.285


Standard

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
____________________________________
www.sagmueller.net

Freedom - use it or lose it (Lawrence Lessig)

Im übrigen bin ich der Meinung, dass Microsoft zerschlagen werden muss.
sagi ist offline   Mit Zitat antworten
Alt 16.04.2003, 18:05   #7
käptn
Inventar
 
Registriert seit: 04.11.2001
Alter: 45
Beiträge: 2.150


Standard

q.e.d.

~
____________________________________
LOL - Mein erstes Post im Programmier Forum

MACINTOSH - Most Applications Crash, If Not The Operating System Hangs
käptn ist offline   Mit Zitat antworten
Alt 16.04.2003, 18:54   #8
schera
Veteran
 
Registriert seit: 03.07.2000
Alter: 46
Beiträge: 430


Standard

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
schera ist offline   Mit Zitat antworten
Alt 16.04.2003, 19:41   #9
käptn
Inventar
 
Registriert seit: 04.11.2001
Alter: 45
Beiträge: 2.150


Standard

Sag nicht, du willst 1000 Datensätze anzeigen!?

Sei so gut und poste mal deinen Source.

~
____________________________________
LOL - Mein erstes Post im Programmier Forum

MACINTOSH - Most Applications Crash, If Not The Operating System Hangs
käptn ist offline   Mit Zitat antworten
Alt 17.04.2003, 14:27   #10
schera
Veteran
 
Registriert seit: 03.07.2000
Alter: 46
Beiträge: 430


Standard

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
schera ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 23:50 Uhr.


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