Fatal error: Allowed memory size
frak
- php
Hallo,
Fatal error: Allowed memory size of 10485760 bytes exhausted at (null):0 (tried to allocate 75 bytes) in /.../xxx.php on line 345
kann ich da noch was drehen?
frak
Hello,
Fatal error: Allowed memory size of 10485760 bytes exhausted at (null):0 (tried to allocate 75 bytes) in /.../xxx.php on line 345
kann ich da noch was drehen?
Na, endlich hat es mal wieder jemand geschafft! ;-)
Schau mal in Deine phpinfo(), oder direlt in dir php.ini, was dort eingestllt ist für die typische maximale Scriptgröße.
http://de.php.net/manual/de/configuration.directives.php#ini.memory-limit
In der Regel steht das Memory-Limit bei 10M, was sich ja bei Dir hier bewahrheuten würde: 10*1024*1024=10485760.
Bevor Du aber n memory_limit schraubst, würde ich lieber mal die Funktionen oder Schleifen Deines Scriptes prüfen, die den Speicher verbraten.
http://de.php.net/manual/de/function.memory-get-usage.php
1. Handles nach Gebrauch zurückgeben
2. Arrays nach Umkopierprozessen wieder freigeben -> unset()
3. auch einzelne Variablen bringen was...
4. Daten auslagern in Files
5. Für die Sessiondatei gelten ebenfalls die Punkte 2,3,4
6. MySQL-Resultsets freigeben, hat aber keinen Einfluss auf den
Scriptspeicher
Liebe Grüße aus http://www.braunschweig.de
Tom
- MySQL-Resultsets freigeben, hat aber keinen Einfluss auf den
Scriptspeicher
Werden Die nicht automatisch freigegeben?
Tom
Hello,
- MySQL-Resultsets freigeben, hat aber keinen Einfluss auf den
Scriptspeicher
Werden Die nicht automatisch freigegeben?
Nein. Nicht während der Scriptlaufzeit.
Nun gibt es ja Scripte, die nur ein einziges Query absetzen, da ist das nicht interessant. Aber es gibt auch wirkliche Programme, die zur Abfrage und Manipulation von Datenbeständen schon mal 30 und mehr Queries in einem Script benötigen. Da juss man dann schon mal genau hinschauen, ob man das Resultset überhaupt noch braucht. Sonst fängt nämlich der SQL-Server an zu swapen, und damit geht die Perfomance mindestens um Faktor 1000 in die Knie.
Wir hatten hier neulich so ein Beispiel. Der Fragesteller hat sein Script durch frühzeitige Freigabe ungefähr 6mal so schnell bekommen. Und ob ein Besucher nun 3sec oder 18sec auf eine Antwort warten muss, ist schon relevant.
Aber ein viel wichtiger Punkt sind hier die Freigaben nicht mehr benötigter Arrays. Die baut man sich ja oft mit
$_daten = file("dateiname")
ganz unbedacht auf, und vergisst sie dann bis ans Scriptende...
Wozu die Daten noch halten, wenn sie schon lange wieder weggeschrieben sind.
Das Auslagern von Daten betraf z.B. die Bildspeicherung. Das Bild wird hochgeladen, ins Script gezogen und dann ggf. auch nochmal in der Session abgelegt. Das ist unpraktisch. Besser gleich in Datei abspeichern und nur den Pfad/Namen des Files merken. Den Pufferspeicher wieder freigeben.
Liebe Grüße aus http://www.braunschweig.de
Tom
Aber ein viel wichtiger Punkt sind hier die Freigaben nicht mehr benötigter Arrays. Die baut man sich ja oft mit
$_daten = file("dateiname")
ganz unbedacht auf, und vergisst sie dann bis ans Scriptende...
da ist was dran
was hat eigentlich "tried to allocate 148 bytes" in der fehlermeldung zu bedeuten?
besonders 148 Bytes ist mir nun ins auge gefallen am anfang war die zahl niedriger und je mehr unsets ich einbaue desto höher steigt sie, aber ich weiss schon jetzt nicht mehr wo ich noch welche einbauen kann.
sehe ich da wie nah ich am ziel bin bzw. von der fehlermeldung wegkomme?
frak
Hello,
was hat eigentlich "tried to allocate 148 bytes" in der fehlermeldung zu bedeuten?
besonders 148 Bytes ist mir nun ins auge gefallen am anfang war die zahl niedriger und je mehr unsets ich einbaue desto höher steigt sie, aber ich weiss schon jetzt nicht mehr wo ich noch welche einbauen kann.sehe ich da wie nah ich am ziel bin bzw. von der fehlermeldung wegkomme?
"Habe versucht, 148 Bytes zu reservieren"
Unter Speicher-Allokation versteht man die Anforderung von Hauptspeicher vom Betriebssystem oder auch innerhalb eines selbstverwalteten internen Speicherbereichs eines Programms. Je nach OS und Strategie werd die "Häppchen" dann 16Byte-weise oder 64-byte-weise o.ä. zugeteilt. Innerhalb der zugeteilten Blöcke kann das System dann wieder selbst unterteilen.
PHP unterstützt eine dynamische Speicherzuordnung. Die typisch zugewiesenen 10M besorgt sich PHP pro Script von Haus aus beim OS und verteilt die dann intern. Wenn man also 50 Nutzerscripte gleichzeitig laufen hat, sind dafür 500M Speicher zusätzlich erforderlich.
Nun zur Fehlersuche:
Benutze die Funktion http://de.php.net/manual/de/function.memory-get-usage.php
Bau an verschiedenen Stellen in deinem Script ein:
http://de.php.net/manual/de/function.error-log.php
int error_log ( "Checkpoint xy: ".memory_get_usage(),3,"/pfad_zur_datei/datei");
Dann musst Du allerdings darauf achten, dass Die das Log nicht vollgeschrieben wird. Ich vermute ja eine Endlosschleife, Rekursion oder sonstigen zyklischen Verlauf...
Beschreib doch mal, was Dein Script so machen sollte. Dann kommen wir vielleicht noch auf bessere Ideen,
Liebe Grüße aus http://www.braunschweig.de
Tom
Dann musst Du allerdings darauf achten, dass Die das Log nicht vollgeschrieben wird. Ich vermute ja eine Endlosschleife, Rekursion oder sonstigen zyklischen Verlauf...
Beschreib doch mal, was Dein Script so machen sollte. Dann kommen wir vielleicht noch auf bessere Ideen,
also es ist keine endlosschleife ect, weil es ja funktioniert wenn das datenpaket kleingenug ist.
ich hole emails mit pop3 funktionen die emails haben anhänge und die anhänge sind je 1mb in meinen test. habe ich 2 emails funzt es schon nicht mehr also 2MB.
ich will es so machen pro scripaufruf nur eine email - dann dürfte es gehen.
frak
Hello,
ich hole emails mit pop3 funktionen die emails haben anhänge und die anhänge sind je 1mb in meinen test. habe ich 2 emails funzt es schon nicht mehr also 2MB.
ich will es so machen pro scripaufruf nur eine email - dann dürfte es gehen.
Du kannst doch eine Schleife aufbauen, die pro Durchlauf eine Mail abholt. Kann sein, dass für Socket-Zugriffe auch upload_max_filesize gilt obwohl das ja eigentlich ein Download ist, oder?
Ich habe PHP nicht gebaut.
Liebe Grüße aus http://www.braunschweig.de
Tom
hi,
wie kann ich an einem punkt im script alles auf 0 setzen und so tun als ob ein neues script anfängt?
dann hätte ich noch ne bessere idee.
frak
- Handles nach Gebrauch zurückgeben
versteh ich nicht.
- Arrays nach Umkopierprozessen wieder freigeben -> unset()
das hört sich gut an!
- auch einzelne Variablen bringen was...
- Daten auslagern in Files
du meinst einzelne arrays in die file und bei bedarf holen oder wie?
- Für die Sessiondatei gelten ebenfalls die Punkte 2,3,4
es kommt keine session vor in diesem script.
haben prints im script auch einfluss auf die dauer des scripts?
ich denke dabei an ewige prints die die seiten in millionen zeilen füllen?
ok ich schreib das script mal n bissi um.
frak