php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 23-10-2009, 13:21
Lengen1971
 Registrierter Benutzer
Links : Onlinestatus : Lengen1971 ist offline
Registriert seit: Oct 2003
Beiträge: 57
Lengen1971 ist zur Zeit noch ein unbeschriebenes Blatt
Lengen1971 eine Nachricht über ICQ schicken
Standard ImageFromJPEG wirft Fehler

Hallo miteinander,

ich hab schon viel gegoogelt und hatte viel Kontakt mit dem Support von 1und1, aber ich komm nicht weiter, evtl. könnt ihr helfen. Folgende Situation:

- php-Script, dass Bilder am Server auf eine bestimmte Größe rechnet und überschreibt
- liest automatisch alle JPGs eines Ordners und verarbeitet sie
- klappt mit allen Testbildern wunderbar, Dateien bis 20 MB kein Problem.
- jetzt lade ich JPGs von einer Digicam hoch (ca. 1,9 MB pro Bild) und das Script wirft sofort folgenden Fehler:
Zitat:
Fatal error: Out of memory (allocated 33030144) (tried to allocate 3264 bytes) in /homepages/27/d25171253/htdocs/_php/functions.php on line 160
PHP-Code:
$old_jpg=imagecreatefromJPEG($bild_am_server); 
- Paralleltest an einem IIS5 mit gleichem Bildmaterial ergab kein Problem

Mir ist klar, dass irgendwas diese Unmenge an Speicher allokiert, ABER WAS?

Ich hab keinen Zugriff auf php.ini, aber der Support sagt folgendes:
Zitat:
Bitte beachten Sie auch folgende Einschränkungen:
- RAM: 32MB
- NPROC: 24 (d.h.: In Ihrem Vertrag dürfen bis zu 24 Prozesse gestartet
- max. Laufzeit 10 Sek.
PHP-Version: 5.2.11
GD Version bundled (2.0.34 compatible)

Ich bin für jeden Tip offen.
Danke
Gruß
Michel
Mit Zitat antworten
  #2 (permalink)  
Alt 23-10-2009, 13:25
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Hallo,

32MB sind für Bildverarbeitung wirklich etwas wenig. Dennoch kannst auch du etwas tun. Benutzt du zwischendurch imagedestroy, wenn du mehrere Bilder in einem Skript verarbeitest? Willst du mal deinen Code posten? Vielleicht findet sich ja noch die eine oder andere Schwachstelle, die man auch weniger speicherhungrig coden könnte.

Gruß,

Amica
Mit Zitat antworten
  #3 (permalink)  
Alt 23-10-2009, 13:42
pekka
 PHP Master
Links : Onlinestatus : pekka ist offline
Registriert seit: Jun 2001
Ort: Köln
Beiträge: 6.608
pekka befindet sich auf einem aufstrebenden Ast
Standard

Wenn es sich bei den 1,9 MB grossen Bildern um JPGs handelt, kann es gut sein, daß schon ein einziges Bild den Speicher vollmacht. Es muß schließlich ausgepackt werden und liegt dann in Originalgröße (Breite x Höhe x min. 3 oder 4 bytes) im Speicher.
Mit Zitat antworten
  #4 (permalink)  
Alt 23-10-2009, 14:16
DonManfred
 Registrierter Benutzer
Links : Onlinestatus : DonManfred ist offline
Registriert seit: Nov 2003
Beiträge: 81
DonManfred ist zur Zeit noch ein unbeschriebenes Blatt
DonManfred eine Nachricht über ICQ schicken
Standard

Zitat:
Zitat von Lengen1971 Beitrag anzeigen
Hallo miteinander,
- jetzt lade ich JPGs von einer Digicam hoch (ca. 1,9 MB pro Bild) und das Script wirft sofort folgenden Fehler:
Wie gross (ausmaße) ist denn das Bild, was Du da einlesen willst?

Ansonsten check einfach mal den Speicherverbrauch...

PHP-Code:
<?php
/*****
*  - Example CIX88 -
*  Legende zu den benutzen Konstanten:

*  TP = relativer Pfad zu einer Bilddatei
*  CL_PHP = absoluter Pfad zu einer PHP-Klasse oder extra Modul
*  CL_TTF = absoluter Pfad zu einer TTF-Datei
*  CL_FPDF = absoluter Pfad zu einer FPDF-Klasse oder extra Modul
*  CL_IMG = absoluter Pfad zu einer Bilddatei
*  CL_AUDIO = absoluter Pfad zu einer Audiodatei

*  Die hier benutzten Konstanten beziehen sich nur auf diese Beispiele.
*  ! Der Pfad muss natürlich auf deine Gegebenheiten angepasst werden !
*/

error_reporting(E_ALL);

/*
Zum Test wird ein Bild mit 2000x2000 Pixel erstellt.
*/

    
function GetMem$text ) {
        
$text '<p>'.$text.' : '.sprintf("%.3lf"memory_get_usage()/1024/1024 ). ' MB im Speicher </p>';
        return 
$text;
    }

    echo 
GetMem('Scriptanfang');

    
$image ImageCreateTrueColor20002000);
        echo 
GetMem('vor ImageDestroy() bei ImageCreateTrueColor');

    
ImageDestroy($image);
        echo 
GetMem('nach ImageDestroy() bei ImageCreateTrueColor');


    
$image ImageCreate20002000);
        echo 
GetMem('vor ImageDestroy() bei ImageCreate');

    
ImageDestroy($image);
        echo 
GetMem('nach ImageDestroy() bei ImageCreate');


    
$ini ini_get_all();
    echo 
'verfügbar: '$ini['memory_limit']['global_value'];
?>
also hier ein Bild mit 2000x2000 Pixel...

vor ImageDestroy() bei ImageCreateTrueColor : 19.189 MB im Speicher

Also 19mb für das Bild. Soll davon nun noch ein Thumbnail oder sonstwelche Kopieen im Speicher gehalten werden, dann sind das schnell mal 2-3 mal so viel -> 60mb...

Kannst ja mal mit dem Script hier deinen Speicherverbauch tesen...

PS: Vielen Dank an cix für das hier verwendete Codeschnippet...
Mit Zitat antworten
  #5 (permalink)  
Alt 27-10-2009, 13:06
Lengen1971
 Registrierter Benutzer
Links : Onlinestatus : Lengen1971 ist offline
Registriert seit: Oct 2003
Beiträge: 57
Lengen1971 ist zur Zeit noch ein unbeschriebenes Blatt
Lengen1971 eine Nachricht über ICQ schicken
Standard

Hallo miteinander

und danke für die vielen Tips, ich konnte das Problem noch nicht lösen.

@AmicaNoctis
ja, ich benutze imagedestroy. Es ist aber ja nur ein Bild für die Bearbeitung vorgesehen, hier der Code:
PHP-Code:
function ML_getResizedImage($bild_am_server,$lange_seite)
{
  if (
$lange_seite==|| $lange_seite=="" || $lange_seite==false$lange_seite=600;
        
  
$size=getimagesize($bild_am_server);
    
  if (
$size[0]>$lange_seite || $size[1]>$lange_seite)
 {
    
// Image größer als lange_seite
  
$size[0]>$size[1]?$faktor=$size[0]/$lange_seite:$faktor=$size[1]/$lange_seite;
  if (
$size[0]>$size[1]) 
  {
    
$n_width=$lange_seite;
    
$n_height=$size[1]/$faktor;
  }
  else
  {
    
$n_height=$lange_seite;
    
$n_width=$size[0]/$faktor;
  }
  
$jpg imagecreatetruecolor($n_width,$n_height);
  
$old_jpg=imagecreatefromJPEG($bild_am_server);                

  
imagecopyresampled($jpg,$old_jpg,0,0,0,0,$n_width,$n_height,$size[0],$size[1]);
  
imagedestroy($old_jpg);
            
  
//unlink($bild_am_server);
  
imagejpeg  ($jpg,$bild_am_server,90);
            
  if (
file_exists($bild_am_server)) return true;    
  else return 
false;    
  }
  else
  {
    
// Image nicht größer als lange_seite
    
return true;
  }        

@pekka:
getimagesize gibt folgendes aus:
PHP-Code:
Array ( [0] => 3264 [1] => 2448 [2] => [3] => width="3264" height="2448" [bits] => [channels] => [mime] => image/jpeg 
Hm... 8 channels, das ergibt 63922176 Bytes also. ca. 60 MB, das kann ja nicht gehen...

@DonManfred:
Ausgabe deines Scriptes:
PHP-Code:
Scriptanfang 0.130 MB im Speicher

vor ImageDestroy
() bei ImageCreateTrueColor 19.257 MB im Speicher

nach ImageDestroy
() bei ImageCreateTrueColor 0.131 MB im Speicher

vor ImageDestroy
() bei ImageCreate 7.813 MB im Speicher

nach ImageDestroy
() bei ImageCreate 0.130 MB im Speicher
verf
&#65533;gbar: 40M 

Danke für alle Hinweise und Tips.

Gruß
Michael
Mit Zitat antworten
  #6 (permalink)  
Alt 27-10-2009, 13:32
pekka
 PHP Master
Links : Onlinestatus : pekka ist offline
Registriert seit: Jun 2001
Ort: Köln
Beiträge: 6.608
pekka befindet sich auf einem aufstrebenden Ast
Standard

Vielleicht erlaubt dein Provider ImageMagick-Aufrufe? IM läuft m.W. immer außerhalb der Skripteigenen RAM-Beschränkungen.
Mit Zitat antworten
  #7 (permalink)  
Alt 27-10-2009, 13:37
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard

Zitat:
Hm... 8 channels, das ergibt 63922176 Bytes also. ca. 60 MB, das kann ja nicht gehen...
Nein, es ergibt 23970816 Byte, also ca. 23,5MB. Bits steht für die Farbtiefe pro Kanal. Es sind drei Kanäle (Rot, Grün und Blau), die jeweils mit 255 verschiedenen Helligkeitsstufen belegt werden können, was sich mit 8Bit = 1Byte bewerkstelligen lässt. Es sind wie gesagt 3 Kanäle, also braucht ein Pixel des Bildes 3Byte im Speicher.

Wenn ich deinen Code vom kurzen Überfliegen richtig interpretier, dann erzeugst du 2 Bilder im Speicher, mit jeweils über 20MB und schießt somit über dein Limit von 40MB hinaus.

Geändert von Quetschi (27-10-2009 um 14:05 Uhr)
Mit Zitat antworten
  #8 (permalink)  
Alt 27-10-2009, 13:39
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard

Zitat:
Zitat von pekka Beitrag anzeigen
Vielleicht erlaubt dein Provider ImageMagick-Aufrufe? IM läuft m.W. immer außerhalb der Skripteigenen RAM-Beschränkungen.
Da bin ich mir grad nicht sicher - evtl. könnt es auch davon abhängen ob PHP als Modul oder als CGI läuft
Mit Zitat antworten
  #9 (permalink)  
Alt 27-10-2009, 13:43
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard

Also das stimmt so nicht ganz was ich geschrieben hab - ein Bild, dass du im Speicher erzeugst ist kleiner und kann maximal 600x600 groß sein, was maximal ein ca. 1MB großes Bild im Speicher erzeugt. Damit solltest du eigentlich grad noch im Limit liegen...

Nochmal editiert, da falsche MB für 600x600 angegeben.

Geändert von Quetschi (27-10-2009 um 14:38 Uhr)
Mit Zitat antworten
  #10 (permalink)  
Alt 27-10-2009, 14:56
Lengen1971
 Registrierter Benutzer
Links : Onlinestatus : Lengen1971 ist offline
Registriert seit: Oct 2003
Beiträge: 57
Lengen1971 ist zur Zeit noch ein unbeschriebenes Blatt
Lengen1971 eine Nachricht über ICQ schicken
Standard

Hallo,

@Quetschi: Danke für die Erklärung, ich hab jetzt ein 11 MB Bild zum Testen hochgeladen und getimagesize gibt folgendes aus:

PHP-Code:
Array ( [0] => 2048 [1] => 1536 [2] => [3] => width="2048" height="1536" [bits] => [channels] => [mime] => image/jpeg 
Das sind dann wohl knapp 10 MB, dieses Bild geht jedenfalls ohne Probleme.

Kann es etwas mit der Kameraeinstellung zu tun haben? Sind das vielleicht RAW-Daten? Weil, warum ist eine Datei mit höherer Auflösung wesentlich kleiner?

Gruß
Michel
Mit Zitat antworten
  #11 (permalink)  
Alt 27-10-2009, 15:05
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Hallo Michel,

Raw-Dateien sind etwas ganz anderes und haben mit JPEG nichts zu tun. JPEG-Dateien werden durch ein kompliziertes Verfahren kodiert und können daher bei gleicher Pixelanzahl sehr unterschiedliche Dateigrößen ergeben. Kontrastarme Bilder mit weichen Verläufen lassen sich z. B. sehr gut komprimieren, während detailreiche Bilder mit satten Farben und hohem Kontrast in der Regel etwas größere Dateien ergeben.

Gruß,

Amica
Mit Zitat antworten
  #12 (permalink)  
Alt 27-10-2009, 15:23
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard

Zitat:
Zitat von Lengen1971 Beitrag anzeigen
Sind das vielleicht RAW-Daten? Weil, warum ist eine Datei mit höherer Auflösung wesentlich kleiner?
Stichwort JPEG-Komprimierung - die Freundin der Nacht hat es ja im Prinzip schon erklärt.

Zusätzlich kann man noch erwähnen:
Du kannst das gleiche Bild mit gleichen Pixelmaßen (sagen wir mal 3000x2000) einmal mit geringer Komprimierung speichern, was die Qualität des Ausgangsbildes sehr gut erhält, aber mehr Platz auf der Festplatte einnimmt und du kannst das gleiche Bild einmal mit starker Komprimierung speichern, wodurch es wenig Platz auf der Festplatte verbraucht, die Bildqualität leidet dann jedoch darunter.

Ist aber alles völlig egal - wenn du Bilddaten mit PHP-Bordmitteln verarbeitest, zählt nur die Größe in Pixeln, die Anzahl der Kanäle und die Farbtiefe. Was die Datei als .jpg gespeichert auf der Platte belegt hat keinerlei Relevanz.
Mit Zitat antworten
  #13 (permalink)  
Alt 27-10-2009, 15:27
Lengen1971
 Registrierter Benutzer
Links : Onlinestatus : Lengen1971 ist offline
Registriert seit: Oct 2003
Beiträge: 57
Lengen1971 ist zur Zeit noch ein unbeschriebenes Blatt
Lengen1971 eine Nachricht über ICQ schicken
Standard

Hallo Quetschi und "FreundinDerNacht",

vielen Dank für eure Erklärungen, dann bleibt nur noch, die DigiCam auf weniger Pixel einzustellen, hierfür würde theoretisch ja 1 MegaPixel reichen.

Aber komisch ist es doch. Es sind beide sehr detailreiche Bilder mit hoher Qualität abgespeichert und trotzdem so ein riesen Größenunterschied... hm.

Wenn die Kamera RAW-Daten speichert und mein Kumpel sie direkt von der Speicherkarte auf den Computer kopiert, das hätte auch keine Auswirkung?

Danke
Gruß
Michael
Mit Zitat antworten
  #14 (permalink)  
Alt 27-10-2009, 15:38
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard

Zitat:
Zitat von Lengen1971 Beitrag anzeigen
vielen Dank für eure Erklärungen, dann bleibt nur noch, die DigiCam auf weniger Pixel einzustellen, hierfür würde theoretisch ja 1 MegaPixel reichen.
Oder vor dem Upload auf den Server verkleinern!?
Zitat:
Zitat von Lengen1971 Beitrag anzeigen
Aber komisch ist es doch. Es sind beide sehr detailreiche Bilder mit hoher Qualität abgespeichert und trotzdem so ein riesen Größenunterschied... hm.
mh - um das zu beurteilen müsst ich die Bilder schon sehen - dennoch, die Größe als .jpg-Datei kann schon sehr unterschiedlich ausfallen (Bei verschiedenen Bilder mit gleicher Pixelgröße und gleicher Komprimierungseinstellung).
Zitat:
Zitat von Lengen1971 Beitrag anzeigen
Wenn die Kamera RAW-Daten speichert und mein Kumpel sie direkt von der Speicherkarte auf den Computer kopiert, das hätte auch keine Auswirkung?
Wie? RAW-Daten wirst du kaum oder gar nicht mit PHP verarbeitet bekommen. Keine Ahnung ob man den RAW-Codec da irgendwie reinbringen kann.
Mit Zitat antworten
  #15 (permalink)  
Alt 27-10-2009, 15:57
Lengen1971
 Registrierter Benutzer
Links : Onlinestatus : Lengen1971 ist offline
Registriert seit: Oct 2003
Beiträge: 57
Lengen1971 ist zur Zeit noch ein unbeschriebenes Blatt
Lengen1971 eine Nachricht über ICQ schicken
Standard

Hallo Quetschi,

ich stell dir die beiden Bilder mal zum Anschauen auf´n Server:

PA0801102.jpg <- dieses Bild (1,9 MB) geht nicht
FILE0269.JPG<- dieses Bild (13,2 MB) geht


@all: Vielen Dank für die vielen Hilfestellungen und die Geduld

Gruß
Michael
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[PHP5] Fehler in der Ausgabe ... Wer findet den Fehler? Natheedo PHP Developer Forum 1 03-02-2009 01:46
Fehler über Fehler sTOOs PHP Developer Forum 4 10-07-2004 00:48
unset($fehler) und $fehler=false syco23 PHP Developer Forum 6 19-03-2004 13:31
HP 970 Cxi wirft unerlaubt Seiten aus... Metallica Windows (Client/Server) 8 05-07-2003 20:50
Suchmaschine Acoon wirft jetzt auch eDonkey-Links aus Wotan News / Kostenloses 0 11-12-2002 12:33

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 02:33 Uhr.