zur « Themenübersicht Dit&Dat

Diverses - Sparte

Eingetragen / aktualisiert am 07.02.2010

Das Problem mit dem Speicher entsteht dann, möchte man hoch geladene Bilder verkleinern.
Aber mit einer .htaccess oder mit PHP kann man die Servereinstellungen aushebeln, zumindest bei einigen Providern bzw. Hostern...

Das Problem

Bei euch laufen komplizierte Scripte oder PlugIns mit hohem Speicherbedarf, oder was wohl der meiste Fall sein dürfte:
Ihr möchtet mit PHP Bilder auf dem Server laden, diese sollen dann für die Webdarstellung oder für Thumbnails auf eine bestimmte Größe herunter gerechnet werden.
Meistens funktioniert das einwandfrei, aber wenn die hochgeladenen Bilder eine bestimmte Größe erreichen, funktioniert das nicht mehr. Je nach Programmierung erscheint eine Fehlermeldung oder einfach nichts.
Das Hochladen der Bilder klappt meistens noch, aber das Herunterrechnen nicht. Bei einigen Providern erhaltet Ihr die Fehlermeldung:

Fatal error: Allowed memory size of 3xxxxxxx bytes exhausted (tried to allocate xxxx bytes) in
/var/www/httpdocs/.../upload.php on line xxx

Die Ursache

Verantwortlich ist dafür der in der phpini des Servers definierte Wert des höchstzulässigen Speicherbedarfs. Der beträgt je nach Hoster oder Provider mal nur 12 bis 24, bei manchen sogar bis 40MB. Das sollte eigentlich für alle Fälle ausreichen, aber nicht für das herunter Rechnen von Bildern.
Wieso, mein 2.000px Bild hat doch nur 300kb?
Das Dumme ist, dass PHP die .jpg entkomprimiert, bzw. mit nichtkomprierten Daten rechnet. Die Bildgröße in kb ist für PHP sekundär!

Beispiel:
Wie haben ein Bild von 2.000 x 1.600 Pixel

Daraus ergeben sich (Länge mal Breite) 3.200.000 bits multipliziert mit der Farbtiefe von z.B. 24 bit sind das 76.800.000 bits, geteilt durch 8 = 9.600.000 byte = 9.375 kb = 9,375 MB

Dazu gerechnet werden muss noch das neu errechnete Bild und der Speicherbedarf für Rechenprozesse etc.
Schnell wird hier das vom Hoster oder Provider erlaubte Memory Limit überschritten.

Tipp

Ob die folgenden Tipps bei euch anwendbar sind, solltet Ihr vorher testen! Erstellt eine PHP-Datei und gebt darin folgenden Code ein:

echo ini_get("memory_limit");
$mem = ini_set("memory_limit", "128M");
echo $mem;

Mit ini_get und dem Wert memory_limit wird die Einstellung des Speicherlimits aus der phpini abgefufen, mit ini_set der neue Wert eingegeben. Sind bei der Ausgabe beide Werte identisch, funktionieren die Tipps nicht! Die Erklärung findet sich ganz unten.

Die Lösung

Ihr werdet kaum Zugriff auf die phpini des Servers eures Anbieters haben ;-)
Aber die phpini lässt sich per .htaccess oder PHP überschreiben, bzw. aushebeln. Hier können wir zwei Methoden anwenden:

htaccess

Wenn es euch erlaubt ist, eine eigene .htaccess anzulegen, erstellt eine Textdatei, bennennt sie .htaccess und legt sie in den Dokumentroot des Servers, also auf eurem Webspace. Hier fügt Ihr folgendes ein:

php_value memory_limit 64M

Hier wird der Speicherbedarf oder das Memory Limit global auf 64MB herauf gesetzt. Manch ein Provider oder Webhoster unterbindet eine eigene .htaccess, dafür die zweite Lösung:

PHP

Mit...

ini_set("memory_limit", "128M");

Mit der Funktion ini_set verfügt Ihr über eine mächtige Funktion, die Vorgaben der phpini zu überschreiben. Hier wird der voreingstellte Wert z.B. auf 128MB erweitert.
Wichtig:
Die Funktion muss als erstes innerhalb eines Scriptablaufs eingesetzt werden!
Danach wird das memory_limit wieder auf den voreingestellten Wert zurück gesetzt. Diese Lösung ist auch deshalb IMHO die Bessere, da das memory_limit, bzw. der Speicherbedarf nur dann erhöht wird, wo dies auch notwendig ist.

Hinweis

Bei Anwendung dieser Tipps erscheint bei der .htaccess-Lösung eine 500 `er Fehlermeldung, oder bei der PHP-Lösung wird der neue Wert nicht übernommen.

Ursache:
Manche Provider oder Webhoster, hier insbesondere 1&1 erlauben aus Sicherheitgründen keine Überschreibung der phpini!

Hier bleibt dann nur die Einrichtung eines eigenen Webservers...

 

Memory Limit 69 Speicherbedarf von Bildern