"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

php error: "memory exhausted"

malu 25.11.2007 - 19:16 995 10
Posts

malu

Big d00d
Avatar
Registered: Aug 2005
Location: vienna/ooe
Posts: 206
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

former person of interest
Registered: Sep 2006
Location: -
Posts: 4082
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

Big d00d
Avatar
Registered: Aug 2005
Location: vienna/ooe
Posts: 206
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

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4282
schon überlegt eventuell derartige veränderungen an ein externes prog wie imagemagick zu übergeben?

malu

Big d00d
Avatar
Registered: Aug 2005
Location: vienna/ooe
Posts: 206
ich wills ja als web-page machen - auf meinem image-hosting server laufen lassen und da kommts mir mit php sehr gelegen.

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4282
auf vielen webspace ist mittlerweile imagemagick standardmäßig installiert.

malu

Big d00d
Avatar
Registered: Aug 2005
Location: vienna/ooe
Posts: 206
danke für die infos... aber auf meinem webserver gibts kein imagemagick!

kennt sich niemand mit exceptions in php aus?

Nico

former person of interest
Registered: Sep 2006
Location: -
Posts: 4082
das kommt ja aufs selbe raus. du rechnest einfach vor wie groß die vergrößerte datei is, und vergleichst mit dem maxwert

malu

Big d00d
Avatar
Registered: Aug 2005
Location: vienna/ooe
Posts: 206
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

Here to stay
Registered: Dec 2002
Location: Inside
Posts: 4452
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 ... :-/
Bearbeitet von Rektal am 25.11.2007, 23:59

malu

Big d00d
Avatar
Registered: Aug 2005
Location: vienna/ooe
Posts: 206
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
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz