php error: "memory exhausted"

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/php_error_quotmemory_exhaustedquot_188301/page_1 - zur Vollversion wechseln!


malu schrieb am 25.11.2007 um 19:16

hallo leute!

da mich heute wieder mal das coding-fieber gepackt hat, hab ich ein kleines script geschrieben mit dem es möglich sein soll bilder in der größe und im format zu verändern.

funz nach ein paar stunden arbeit eigentlich auch schon ganz gut nur bin ich jetzt auf ein kleines prob gestoßen:

wenn der user ein großes bild hochlädt (ca 1000x1000 px) und das dann noch auf 200%+ vergrößern will bekomm ich folgende fehlermeldung des servers (lokal-testserver):

Zitat
Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 11280 bytes) in C:\Programme\xampp\htdocs\efoto2\bildbearbeitung_inc.php on line 85

in der php.ini ist das memory-limit auf 32 mb eingetragen (mit dem ich auch arbeiten will) natürlich könnt ichs jetzt hochschrauben - aber auf ein xy webserver ist das später mal nicht der fall.

der fehler wird vom befehl imagecreatetruecolor ausgelöst:
Code: PHP
								$x=floor($x*$_POST['prozangabe']/100);
$y=floor($y*$_POST['prozangabe']/100);

$pic = imagecreatetruecolor($x,$y);

wollte das problem jetzt so in die richtung lösen:
Code: PHP
$x=floor($x*$_POST['prozangabe']/100);
$y=floor($y*$_POST['prozangabe']/100);

try
{
	$pic = imagecreatetruecolor($x,$y);
}
catch(Exception $e)
{
	echo($e->getMessage());
} 

leider bekomm ich wieder genau die obige fehlermeldung. :(

hab in php noch nie mit exceptions gearbeitet nur in java.
aber prinzipiell müsste es doch so gehen, oder?
oder kennt jemand eine andere lösung für das prob?

will dass das skript "erkennt" ob die allozierung des speichers für das bild noch möglich ist oder nicht und nicht mit einem fatal error stirbt. *g*

hoff ihr könnt mir weiterhelfen!

thx mlu


Nico schrieb am 25.11.2007 um 19:29

lies die max filesize aus (php.ini), vergleich sie mit der filesize (bild), und erst dann wende die resize funktion an.

http://de2.php.net/ini_get


malu schrieb am 25.11.2007 um 19:39

die vom ausgangsbild ist ok
ich kann das bild ja z.b. auf das 1.5 fache vergrößern
oder nur drehen....o.ä.

aber wenn ich es zu groß vergrößern will (und im php code dafür zu viel mem. angefordert würde) das script also mehr arbeitsspeicher anfordert als das memlimit ist bekomm ich den fehler. :(


kleinerChemiker schrieb am 25.11.2007 um 19:46

schon überlegt eventuell derartige veränderungen an ein externes prog wie imagemagick zu übergeben?


malu schrieb am 25.11.2007 um 19:52

ich wills ja als web-page machen - auf meinem image-hosting server laufen lassen und da kommts mir mit php sehr gelegen.


kleinerChemiker schrieb am 25.11.2007 um 19:55

auf vielen webspace ist mittlerweile imagemagick standardmäßig installiert.


malu schrieb am 25.11.2007 um 20:17

danke für die infos... aber auf meinem webserver gibts kein imagemagick!

kennt sich niemand mit exceptions in php aus?


Nico schrieb am 25.11.2007 um 20:24

das kommt ja aufs selbe raus. du rechnest einfach vor wie groß die vergrößerte datei is, und vergleichst mit dem maxwert


malu schrieb am 25.11.2007 um 20:35

ja das hab ich mir auch schon gedacht... aber so einfach ist das nicht...
denn es steht nicht immer der gesamte speicher zur verfügung da schon speicher für den skriptteil vor der bildvergrößerung belegt ist. ich also nicht genau weiß wie viel ich noch habe - bzw. das von bild zu bild (-art jpg,gif,png,...) unterschiedlich ist.

und man kann ja auch (besonders bei jpgs) nicht fix sagen:
x*y = pixelanzahl * hausnummer bits = filesize. afaik.


Rektal schrieb am 25.11.2007 um 23:57

Zitat von malu
kennt sich niemand mit exceptions in php aus?

Ja, aber das bringt hier nichts. Warum? Weil das keine Exception sondern ein Fatal error ist. Es gibt recoverable Fatal errors, aber bei memory exhaustion ist keiner davon. Die Engine unterbindet auf einer sehr unteren Ebene die allokierung von neuem Speicher, d.h. jeder danach ausgeführte Code vermutlich sofort wieder das memory_limit überseigen.

Was du machen kannst ist, dass du ein weiteren PHP-Script per HTTP-Request aufrufst (quasi am selben Server liegend) und du a'la REST einen Status im Output zurückgibst. Wenn dort ein Fatal Error auftritt kannst du das darauf reagieren.

Hier ein Pseudo-Code (achtung, entzieht sich jeglichen Anspruches, vor allem was Security und Ressourcen betrifft):
Code:
move_uploaded_file(..., $dorthin);
$result = file_get_contents("http://meine-domain/rescale/?identifier=fuerdasbild");
$result auswerten

PHP ist halt die falsche Sprache um sowas sauber zu handeln, mit der Wald-und Wiesensprache wirds immer unsauber ... :-/


malu schrieb am 26.11.2007 um 08:53

hey danke rekt für die infos!
werds mal so versuchen... aber du hast recht... echt sauber ist das auch nicht...

shit jetzt hätt ich mich schon so auf die exception-lösung gefreut! ;) *g*

naja sonst muss ichs wirklich mit einer art "speicher-verbrauchs-abschätzung" machen.

muss mal schaun ob ich was finde wie man halbwegs genau den (arbeits)speicherverbrauch eines jpg,gif oder pngs berechnen kann.

thx mlu




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025