feststellen wo Skript hängt! - Wie?
Steve
- php
Hallo Ihr,
Folgendes Problem:
Newsscript läuft sehr langsam> hab es bisher auf die Menge der News geschoben (is Textbasierend) jetzt habe ich mal alle ungebrauchten Daten-Files gelöscht, und was muss ich feststellen!? : genauso langsam (12sec statt bisher 0,5sec).
jetzt würde ich gerne feststellen in welchen Teil des Scriptes so lange gebraucht wird, gibts da ne möglichkeit?
zB. das alles geloggt wird mit Zeitstempel oder so?
Danke mal!
Steve.
abend,
wie wäre es mit nem php-debugger ?
http://www.google.de/search?q=php+debugger&ie=UTF-8&oe=UTF-8&hl=de&meta=
oder zB http://dd.cron.ru/dbg/downloads.php...
mfg,
(tanz das)
Z.N.S.
Hallo,
versuch mal probehalber, geöffnete Files wieder zu schließen, alle nicht mehr benötigten Variablen wieder freizugeben, wenn Datenbankverbindungen genutzt werden, die Resultsets nach Benutzung wieder freizugeben.
Das Letztere bringt meistens ungeahnte Performanceschübe.
Grüße
Tom
Das Letztere bringt meistens ungeahnte Performanceschübe.
Das würde mich jetzt auch interessieren. Was heisst Resultsets freigeben und wie macht man das?
Guten Abend, <-- soviel Zeit muss sein!
Das Letztere bringt meistens ungeahnte Performanceschübe.
Das würde mich jetzt auch interessieren. Was heisst Resultsets freigeben und wie macht man das?
Das bezieht sich auf die Verwendung von SQL-Datenbanken. Die Resultsets eines Query liegen nicht in der Speicherhohheit von PHP, zählen daher nicht zu den 8MB Standard dazu. Wenn man umfangreiche Abfragen macht, fängt die Datenbank aber an, ihren Speicher zu swapen, und das dauert dann ca. 4 bis 20 Mal solange, je nach sonstiger HDD-Cache-Auslastung.
Also öfter mal eine abgearbeite (mySQL)-Abfrage wieder freigeben.
z:b. mit mysql_free_result($res);
Grüße
Tom
Guten Abend <--- bitte sehr :)
Aha, aber nach jeder Abfrage machts auch keinen Sinn?
Also so "öfter mal" kann ich das in einem PHP Skript ja nicht machen, das ist entweder drin oder nicht.
Hallo,
Aha, aber nach jeder Abfrage machts auch keinen Sinn?
Also so "öfter mal" kann ich das in einem PHP Skript ja nicht machen, das ist entweder drin oder nicht.
Ich habe bis eben geglaubt, es gäbe keinen blöden Fragen ;-))
Natürlich gibt man eine Ressource _sofort_ wieder frei, wenn man sie nicht mehr benötigt und nicht "irgendwann".
Wann das in Deinen Skripten der Fall ist, weiß ich natürlich nicht.
Ein beliebter Fehler sind dabei allerdings Abfragen in Schleifen
Schleifenstart
$res = Abfrage
Verarbeitung von $res
Schleifenende
Wenn man das so macht, dann wird das Handle auf die Ressource überschrieben. damit kann man die nicht benötigte gar nicht mehr frei geben. Sie bleibt (je nach Betriebssystem) so lange blockiert, bis das Script endet, bis der Interpreter endet oder sogar bis das Betriebssystem herungergefahren wird.
Bei Arbeiten mit Flat-Files gilt für das Dateihandle das gleiche!
Grüße
Tom
Hallo Du,
fällt mir noch die Frage ein: auf welchem Betriebssystem läuft der Server?
Bei Windows-Systemen mit FAT muss man die Verzeichnisse von Zeit zu Zeit mal umkopieren. Das "Löschen" des Dateikopfes aus dem Verzeichnis löscht ihn nicht wirklich, sondern markiert nur das erste Zeichen mit "gelöscht". Alle gelöschten Dateien sind also noch da. Sie werden zwar dann der Reihe nach wieder überschrieben, aber wenn man sehr viele Dateien im Verzeichnis gehabt hat, dann ist die Kette, die bei jedem Zugriff gelesen werden muss (bis zum Treffer) ggf. sehr lang.
Grüße
Tom
Hallo
fällt mir noch die Frage ein: auf welchem Betriebssystem läuft der Server?
Linux.
muss erst mal dazusagen ich bin noch recht neu in Php (Mittelgewicht;-)), und das script ist so mein 1. richtiges großes script. Es ist eigentlich ein Newsscript, unm das ich immerwieder etwas 'drumrumgebaut' habe (include) um so ärgerlicher ist es jetzt, festzustellen das daß Newssystem im Betrieb wohl zu schwach ist (hätte doch gleich MySql nehmen sollen.).
nachdem ich jetzt mal 'überflüssige' Beiträge gelöscht habe, wurde es auch nicht besser.
Irgendwie kann ich aber auch nicht glauben, das ca 120News (Okt) das system in die Knie zwingen... vielleicht hab ich doch irgendwo n Bock gebaut?
Deshalb möchte ich einfach mal das Programm checken, irgendwie loggen, wasweisich!?
irgendwie muss doch feststellbar sein wie lange das script braucht von Befehl'A' nach Befehl'B' nach BEFEHL'C' usw.
somit könnte ich die 'Bremse' lokalisieren.
Hallo,
hast Du irgendwo Zugriffe auf externe Ressourcen drin?
Wenn Du die nämlich mit feof() zu kontrolliern versuchst, dann kann es sein, dass Du da TimeOut's von 5sec. pro Test reinbekommst.
Grüße
Tom
hast Du irgendwo Zugriffe auf externe Ressourcen drin?
ja, hab die aber testweise schon alle ausgegliedert.
grobe Struktur:
<TABLE><TR>
<TD>
include Menu/Statistik/Vote usw
</TD><TD>
NEWSWRITER()
</TD><TD>
include Menu/Statistik/Vote usw
</TD></TR><TABLE>
NEWSWRITER() {
öffne Monatsordner
auslesen der daten in array
print array mit template
}
die Verzögerung tritt definitiv in der Funk NEWSWRITER() auf.
Hallo,
Irgendwie kann ich aber auch nicht glauben, das ca 120News (Okt) das system in die Knie zwingen... vielleicht hab ich doch irgendwo n Bock gebaut?
Wir haben eines mit mittlerweile 3078 News und das läuft stabiler als die auch verwendete mySQL-Datenbank. "Geheimnis" sind ignore_user_abort, flock und entsprechende retries.
Deshalb möchte ich einfach mal das Programm checken, irgendwie loggen, wasweisich!?
--> error_reporting( E_ALL );
--> unter jeder relevanten Zeile: print '' __LINE__ . ': Aufruf von ... in Ordnung.';
irgendwie muss doch feststellbar sein wie lange das script braucht von Befehl'A' nach Befehl'B' nach BEFEHL'C' usw.
http://www.php-faq.de/q/q-code-performance.html könnte Dir helfen.
Gruss, Thoralf