Daniel: PHP/mySQL unter LAMP "Fatal error: Allowed memory size..."

Hallo,

mich ereilte kürzlich die folgende Fehlermeldung:

Fatal error: Allowed memory size of 16777216 bytes exhausted
(tried to allocate 328 bytes) in Unknown on line 0

Ursache ist ein zugegebenermaßen recht Performancelastiges PHP-Script welches munter allerlei mySQL-Querys stellt.

Ich hab jetzt schon das halbe Internet durchgelesen, konnte aber keine Antwort auf die Frage finden ob es daran liegt, das PHP einfach ein zu niedriges Memory-Limit hat, oder ob hier ein mysteriöses Memory-Leak vorliegt(Vermutung des SysAdmins).

Der Fehler ist nicht reproduzierbar, tritt jedoch überwiegend in Zeiten auf, in denen das betreffende Script über 100 mal pro Minute
aufgerufen wird. Ein Apache-Restart behebt das Problem nur vorübergehend (für einige Tage), und dient daher nur zur Symptombekämpfung.

Offensichtlich wird der verwendete RAM nicht immer korrekt wieder freigegeben, oder nicht schnell genug wieder geleert.
Fakt ist, das das jetzige Memory-Limit eigentlich reichen sollte.

Kann der Cache (Zend-Optimizer) was damit zu tun haben?
Irgendwelche anderen Ideen?

Bin für alle Ideen dankbar!

Daniel

  1. Hallo,

    Ja, Hallo!

    mich ereilte kürzlich die folgende Fehlermeldung:

    Fatal error: Allowed memory size of 16777216 bytes exhausted
    (tried to allocate 328 bytes) in Unknown on line 0

    Ursache ist ein zugegebenermaßen recht Performancelastiges PHP-Script welches munter allerlei mySQL-Querys stellt.

    Hm. Also das schein allen Ernstes eine Überschreitung des Speicherlimits zu sein. PHP stellt die fest und giebt genau diese Fehlermeldung aus.

    Die Häufung zu Zeiten, in denen vielen Zugriffe erfolgen ist schlicht gesetzmäßig.

    Interessant wäre es zu wissen, welche sql- Abfrage das Problem verursacht: Genau dann werden unter Umständen riesengroße Arrays in PHP erzeugt, die zu diesem Fehler führen können.

    Am besten, Du schreibst Dir die SQL- Abfragen vor dem Absenden in eine Datei und provozierts den Fehler. Dann kannst Du (manuell mit select into outfile) am MySQL- Prompt überprüfen, ob eventuell zu große Array's entstehen. Schau einfach mal auf die Größe der zurückgegenen Datenmenge.

    fastix®