PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : echo zu lahm....



mehlvogel
16-12-2002, 12:58
Also - ich hab ne Templateklasse geschrieben, die den ganzem kram am Ende mit



echo $this->template;
flush();


rauswirft. Das Script welches die Klasse benutzt - ruft den Output ganz am Ende auf. Problem ist jetzt. Auf einer Seite hab ich ne Zeit (für den echo Befehl) von 0.005 sek. Reciht mir auch völlig - aber auf der nächsten Seite hab ich auf einmal eine Zeit (nur für das echo (ohen flush)) eine Zeit von 11.345 sek - Hab mal ein wenig geschaut und gemerkt das es wohl an meiner Verbindng liegt.

Aber warum macht er die eine Seite so schnell und die andere so lahm.

Die eine Seite ist 19157 bytes groß und die andere 65281 bytes. (Der String der ausgegeben wird). Aber da passt das Verhältnis ja nicht. Also - warum dauert der Output so lange? Gibt es eine andere Alternative?

Gaert
16-12-2002, 17:46
Ich schätze, dass es nicht am echo liegt, das so lange dauert, sondern an den Operationen vor dem echo, die halt eine lange Zeit beanspruchen... vielleicht hast du irgendwo einen Flaschenhals in dein Template reinprogrammiert!

mehlvogel
16-12-2002, 18:20
nee ich habs genau nach gemessen, mit



$timer->start("REALOUTPUT");
echo $this->template;
$timer->end("REALOUTPUT");
flush();


Das macht eine von mir geschriebene Klasse, die misst das ganze per mircotime, etc pp. Worauf ich hinaus will ich krieg den Großteil 11,2 von 11,25 sek. Ich kann trotzdem grad mal die ganze Funktion reinstellen:

Bereinigt von der Timer Klasse:


function echo_template() {
$this->parse_keys();
$this->template = stripslashes($this->template);
$this->template = str_replace("\\{", "{", $this->template);
$this->template = str_replace("\\}", "}", $this->template);
//@header("Content-Length: ".strlen($this->template));
echo $this->template;
flush();
}


Und parse_keys() zum besseren verständnis auch:



function parse_keys() {
$this->template = str_replace(array_reverse(array_keys($this->keys)), array_reverse($this->keys), $this->template);
}


Ich würde gerne glauben das der Bottleneck woanders sitzt, denn dann könnte man ihn beheben, aber so ist es echt quasi "unbehebbar".

Gaert
16-12-2002, 19:40
... Das macht eine von mir geschriebene Klasse, die misst das ganze per mircotime, etc pp. Worauf ich hinaus will ich krieg den Großteil 11,2 von 11,25 sek...

Sorry aber den Satz raff ich nicht.
Wo bekommst du die 11,2 Sekunden?

Ich schätze wirklich , dass deine parse_keys() Methode für eine Exponentielle Lastvergrößerung sorgt, je größer dein keys array ist... schließlich lässt du es ja zweimal komplett umkrempeln...

Wie groß ist denn das Keys Array beim ersten Aufruf, und wie groß beim zweiten?

mehlvogel
16-12-2002, 21:27
Also:
Ich habe ein Klasse "Timer" geschrieben, mit der ich sehr einfach Messen kann. Man macht $timer->start("Bezeichner"); und später $timer->end("bezeichner"); dann hat er die Zeit zwischen start und end gespeichert. und man kann sie mit $timer->dump("bezeichner") wieder abrufen. Das ist aber nebensächlich.

Ich habe einmal die Laufzeit gemessen, also so:



include(pfad/timer.php);
$timer = new Timer();
$timer->start("RUNTIME");

/* Do some shit */

$timer->end("RUNTIME");
$timer->dump(); // Gibt alle gespeicherten Zeiten aus


Dann habe ich im Script die Zeile:



$timer->start("OUTPUT");
$template->echo_template();
$timer->end("OUTPUT");


Und echo_template ist halt die obige Funktion als Output erhalte ich in etwa das. Nun starte ich die Hauptseite dann erhalte ich das:



RUNTIME 0.1375
OUTPUT 0.0354
REALOUTPUT 0.0005


Die Werte schön und gut. Klick ich jetzt ein wenig rum und gelange auf eine der nächsten Seiten erhalte ich:



RUNTIME 11.2875
OUTPUT 10.9554
REALOUTPUT 10.9268


Das der Output normalerweise (also Beispiel 1) so "lange" dauert ist mir klar - das liegt an der replace Funktionen. Aber das war schon die schnellste Methode (Hab allerlei ausprobiert aber die waren alle 0.05 - 0.07 langsamer - und das ist inakzeptabel).

Ich weis das das Problem ein wenig confusing ist. Hoffe trotzdem du verstehst mein Problem jetzt...

PS: Wie man vielleicht merkt ist Geschwindigkeit mir sehr wichtig - deshalb bin ich für weitere Vorschläge gerne offen [und ich werde sie testen] ;)

mehlvogel
18-12-2002, 09:25
Was ich gerade bemerkt habe ist, das es wohl Clientabhängig ist - Hier in der Schule wo ich eine schnellere Anbindung habe - brauch die Seite halt keien Elf Sekunden sondern nur zwei aber der output dauert in Relation wieder genauso lange. Es scheint so als wenn der echo wartet bis alles empfangen wurde. Das macht er aber nur bei einigen Seiten nicht bei allen.

Kann das an einer WEbserver Einstellung liegen (das der Outputbuffer begrenzt ist?) Wenn ja, wie hoch liegt so ein Einstellung, normalerweise.
Kann ich mit den ob_* Befehlen da evtl was verändern?

Gaert
18-12-2002, 18:49
Hmm...

Falls es wirklich an der größe des Output Buffers liegt, dann könnte ein mehrmaliger aufruf von ob_flush() während des Content zusammenbaus vielleicht wirklich helfen!

Über SendBufferSize kann man in der httpd.conf auf eine größere Puffergröße festlegen... hab ich aber noch nie ausprobiert!
http://www.apacheref.com/ref/http_core/SendBufferSize.html

mehlvogel
18-12-2002, 19:23
Das Problem ist ja, das ich zwischendurch nicht senden kann da ich immer wieder Cookies und Headers (was zum Teufel ist der Plural von header?) verwenden können muss. Der Output darf wirklich erst ganz zum Schluß kommen - hmm vertrackt...