php error: "memory exhausted"
malu 25.11.2007 - 19:16 995 10
malu
Big d00d
|
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): 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: $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: $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
|
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
|
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
|
schon überlegt eventuell derartige veränderungen an ein externes prog wie imagemagick zu übergeben?
|
malu
Big d00d
|
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
|
auf vielen webspace ist mittlerweile imagemagick standardmäßig installiert.
|
malu
Big d00d
|
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
|
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
|
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
|
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): 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
|
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
|