Fatal Error : Allowed memory size exhausted

S

SE

Hi Leute ...
ich hab da mal n ziemliches Problem ... genauer 2 ...

System:

Win 7 Ulti x64
Apache/2.2.20 (Win32) PHP/5.2.17
phpMyAdmin 3.4.4
MySQL 5.5.15 x64

Was ich tue : ich will eine Datei in ein LONGBLOB Feld laden ... und das klappt nicht auf Grund des Fehlers.
Was merkwürdig ist : alle relevanten Einstellungen *post_max_size , upload_max_filesize und memory_limit* habe ich auf 256MB gestellt , MySQL hat sogar 1GB für max_allowed_packet ... das System hat 4GB zur verfügung , an fehlendem Speicher liegt es also nicht ... aber ich bekomme diese Meldung das das Limit von 256MB überschritten wurde ... und zwar mit 200MB ... also weniger als das Limit ... und das obwohl die Datei nur 100MB groß ist.
Der Fehler tritt in dem File ROOT/phpMyAdmin/libraries/File.class.php in verschiedenen Zeilen auf ... abhängig von der Dateigröße.

Was ich jetzt also für Fragen habe :

1) Warum ist das File für PHP angeblich doppelt so groß als es wirklich ist ?
2) Warum sagt mir PHP das die Grenze von 256MB überschritten ist obwohl nur 200MB versucht werden zu allokieren ?

Fehlermeldung wird schwierig da wie gesagt die Zeilennummer verschieden ist ... abhängig von der Filegröße.

Was sehr lustig ist : dieser Fehler tritt selbst bei Files mit 2MB auf ... also einer Größe die selbst mit den Standardeinstellungen machbar ist.

Google liefert nur die Antwort die 3 Werte die ich schon auf das Doppelte erhöt habe zu erhöhen ... was mir aber in anbetracht dem Fehler , das angeblich das Limit , welches höher ist das der Speicher der versucht wird zu allokieren , überschritten wird , eher auschließt.

Da ich lange nichts mehr mit PHP gemacht habe werde ich mir mal schnell das Tutorial zum File-Upload unter PHP ansehen und da die DB-Verbindung einbauen ... das sollte ich noch hinbekommen. Ergebnis werde ich euch mitteilen.

Danke für die kaputten Köpfe im vorraus ...

SPiKEe

btw : wenn irgendwer seine Glaskugel noch in Reperatur hat und mehr Infos braucht bitte genau sagen WELCHE Infos gebraucht werden ... ich habe keine Lust phpinfo() zu posten und mir dann einer sagt das das alls OK ist ...
 
UPDATE

Ich habe es jetzt mal mit folgenden Tut probiert
http://www.tutorials.de/content/506-upload-via-formular.html
Zum Test habe ich eine 250MB große Datei sowohl local als auch über Netz getestet *LAN* ... und siehe da ... es geht. Laut SHA512 Hash stimmen die Files 100% überein.
Es scheint also ein Problem mit der File-Klasse von phpMyAdmin zu sein. Also heißt es jetzt mal dort im Forum nachgucken.

UPDATE 2

Ich hab gerade auf phpMyAdmin 3.4.5 geupdated ... Fehler besteht weiterhin.
 
Zuletzt bearbeitet von einem Moderator:
Ich glaube nicht, das es mit dem Upload speziell zu tun hat. Eher mit der weiteren Verarbeitung der Datei in der File-Klasse. Könnte es sein, das der Error in der Methode PMA_File::getContent() auftritt?

Versuch mal einen Stack-Trace zu bekommen, in dem du die Extension xdebug installierst. Evtl. kann man den Fehler dann eingrenzen. Imho hat es was mit memory_limit zu tun, im Zusammenhang damit, das die Datei in verschiedene Buffer geladen wird, abhängig davon, was in der getContent()-Methode für Parameter gesetzt sind.

Mit Stack-Trace kann man viel intelligentere Aussagen treffen.
 
Was weis ich in welcher Methode der Fehler auftritt ... wie gesagt : es tritt in unterschiedlichen Zeilen auf welche von RANDOM bei gleichem File bis zu Abhängigkeit zur File-Größe reichen ...
Schemahaft sieht der Fehler bei einer 100MB ! Datei so aus :

Speicher-Limit 256MB überschritten (mit 200MB) ...

Also erstens eine falsche Datei-Größe *nämlich x2 der realen Größe* und dann auch noch sehr witzig das er ein Limit überschreitet von dem er laut den Zahlen noch weit entfernt ist.

Was xdebug angeht : ich kann es ja nachher mal installieren ... aber wenn ich dazu noch was im Code ändern muss dann wird das lustig ...

Aber wie auch oben beschrieben : es kann nichts mit memory_limit oder anderen Limits zu tun haben da diese alle auf 256MB stehen *ja natürlich Server neugestartet*.

Und was PMA angeht : wenn phpMyAdmin meint immer noch diesen ****** verwenden zu wollen dann sind die bei mir an der falschen Adresse ...
 
Die 200MB bedeuten, das PHP bereits 256MB (oder auch etwas weniger) allokiert hat und zusätzlich 200 MB allokieren wollte, dies aber den Rahmen von memory_limit gesprengt hat.

Da du ja Java-Experte bist oder zu mindest reichlich Erfahrung hast, dürfte dir das bekannt vorkommen: Wenn die JVM-Heap-Size festgelegt ist, und ein GC-Lauf noch nicht erledigt wurde, kann es vorkommen, das bereits x-10MB von x belegt sind und der Code jetzt noch 50MB für ein XML-Objekt allokieren will, was aber die Heap-Size sprengt.

Bei PHP passiert genau das gleiche.

Und was du mit dem letzten Satz ausdrücken willst, habe ich ehrlich gesagt, nicht verstanden.
 
Ja ... ist mir schon klar das mit dem Heap ... nur wenn man eine Fehlermeldung so konstrukiert das man zwar angibt wie viel Speicher noch zusätzlich benötigt wird ... dies aber nicht so kennzeichnet und der Eindruck entsteht das das was da steht angibt wie viel verwendet wird ... dann sind solche Interpretationsfehler wie meiner vorprogrammiert. Hier sollte man also mal bei PHP laut werden und eine Änderung dieser Fehlermeldung vorschlagen das wenigstens der Hinweis gegeben wird das das was in Klammern steht eben das ist was versucht wurde zusätzlich zu allokieren ... und nicht das ist was bereits verwendet wird.

Was mich nur wundert ist ja das es mit dem Tut funktioniert ...
Hier liegt der Fehler also definitiv in der von phpMyAdmin verwendeten Klasse ...
Ich habe leider dort noch nichts passendes gefunden weil ich atm wenig Zeit hab *bin atm auf LAN*.

Wegen PMA : da du ja die Funktion mit dem Präfix PMA genannt ist dachte ich das es was mit diesem PMA-User zu tun hat ...
Falls das so sein sollte hat phpMyAdmin halt Pech gehabt ... ich öffne doch kein Sicherheitsleck nur damit i-was so läuft wie es soll ...
Da programmier ich mir dann lieber mein eigenes Upload-Script ...

Trotzdem Danke erstmal für die Info das scheinbar die 256MB schon voll sind ...
Aber nur mal als Rechenbeispiel : wenn das File nur 100MB groß ist ... sind noch gut 150MB bis zum Limit frei. Wenn ich jetzt aber die Meldung bekomme das es fehlgeschlagen ist weitere 200MB zu allokieren *wobei ich immer noch nicht weis warum er versucht den doppelten Speicher zu allokieren als das File groß ist* und damit gesagt wird das der Heap schon voll ist dann müssten ja mit den 100MB File + 200MB was versucht wurde zu allokieren und zusätzlich scheinbar noch die eigentlich 150MB frei ... dann sollten das insgesamt was um die 450MB sein die ich brauche um 100MB zu uppen ?

WAS ZUR HÖLLE ?

Da stimmt dann aber einiges überhaupt nicht ...
Werde mich wohl von phpMyAdmin trennen ...
Ich arbeite ja generell entweder mit der MySQL-Bench oder mit Java an der DB ...
 
Zurück