Zurück   Flashforum > Flash und Server > PHP und MySQL

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 30-08-2004, 15:10   #1 (permalink)
Neuer User
 
Registriert seit: Aug 2001
Beiträge: 147
PHP Memory Error bei Image Script

Hi,

habe seit längerer Zeit ein Script, über das User jpg Bilder hochladen können und für die dann automatisch ein Thumbnail und eine neue Version in den von mir vorgegebenen Dimensionen erstellt werden.
Soweit so gut, das Ganze funktionierte monatelang problemlos.
Nun bekomme ich bei Ausgangsbildern über ~ 500kb die Fehlermeldung:

Fatal error: Allowed memory size of 12582912 bytes exhausted (tried to allocate 8192 bytes) in /var/www/web196/html/ratsschlag/admin/admin_photo_add.php on line 68

Das Script scheint also das Speicherlimit von 12 MB des Providers überzogen zu haben. Ich ruf den Provider an und frag nach... ein Tag später lief es wieder ohne jede weitere Angabe von Gründen.
Jetzt, eine Woche danach, das gleiche Problem wieder.
In der betreffenden Zeile ist lediglich ein
"$src_img = ImageCreateFromJPEG($pfad);"
Mein Provider ist sich anscheinend keiner Schuld bewusst, wie zumindest die Antwort auf meine Mail besagt:
"von unserer seite wurde auch nix verändert"
dazu fällt mir sowieso nichts mehr ein...

Frage: Kennt einer das Problem bzw. wie ich in dem Zusammenhang "Speicher" sparen kann ausser durch frühzeitiges imagedestroy() ?

Bei Bedarf kann ich das ganze Script mal anhängen, ist recht groß (und unübersichtlich ^^)

MfG
PeFro
PeFro ist offline   Mit Zitat antworten
Alt 30-08-2004, 17:27   #2 (permalink)
flachzange
 
Benutzerbild von elias
 
Registriert seit: Jun 2003
Ort: berlin
Beiträge: 3.932
wendest du nach jedem bild ein imagedestroy an? bzw was heist frühzeitig?
nach dem abspeichern solltest du das bild wieder freigeben, wenn du es
überlädst denke ich das du die referenz zum bild verlierst und den speicher
nicht (sofort) freigeben kannst.
__________________

Geändert von binary blade (30-08-2004 um 17:29 Uhr)
elias ist offline   Mit Zitat antworten
Alt 30-08-2004, 17:28   #3 (permalink)
Neuer User
 
Registriert seit: Aug 2001
Beiträge: 147
sobald ich sie nich mehr brauche jo...
da sind auch keine überflüssigen oder was, von daher kann ich da nix groß ändern
PeFro ist offline   Mit Zitat antworten
Alt 30-08-2004, 17:30   #4 (permalink)
flachzange
 
Benutzerbild von elias
 
Registriert seit: Jun 2003
Ort: berlin
Beiträge: 3.932
öffnest du mehrere gleichzeitig? sonst zeig doch mal das script.
__________________
elias ist offline   Mit Zitat antworten
Alt 30-08-2004, 17:35   #5 (permalink)
Neuer User
 
Registriert seit: Aug 2001
Beiträge: 147
PHP-Code:

//
    // Resizen
    
function makethumb($dir,$image,$resizehoehe,$thumbdim) {
      
$pfad $dir.'/'.$image[2];
      
$cachebild $dir.'/cache/'.$image[0].'-th'.'.'.$image[1];
      
$imageinfo getimagesize($pfad);
      
$imagebreite $imageinfo[0];
      
$imagehoehe $imageinfo[1];
      
// Resizebreite errechnen
      
$aprozent round(100/$imagehoehe*$resizehoehe);
      
$resizebreite round($imagebreite/100*$aprozent);
      
// Bild mit neuer Größe erstellen
      
if(file_exists($pfad)){
        if(
$imagebreite!=$resizebreite || $imagehoehe!=$resizehoehe){
          
$resizeimage "true";
        }
        } else {
          
$resizeimage="true";
        }
      if (
$imagehoehe $resizehoehe) {
        
$resizeimage="false";
      }
      
$src_img ImageCreateFromJPEG($pfad);
      if (
$resizeimage=="true"){
        
$thumb imagecreatetruecolor($resizebreite,$resizehoehe);
        
imagecopyresampled($thumb,$src_img,0,0,0,0,$resizebreite,$resizehoehe,$imagebreite,$imagehoehe);
        
imagejpeg($thumb,$pfad,85);
        
imagedestroy($thumb);
      }
      
$finalimage=$pfad;
      
//thumbnail erstellen
      
if ($imagebreite $imagehoehe) {
        
$rsdim=$imagehoehe;
        
$rsxstart=round($imagebreite/2-$rsdim/2);
        
$rsystart=0;
      }else{
        
$rsdim=$imagebreite;
        
$rsystart=round($imagehoehe/2-$rsdim/2);
        
$rsxstart=0;
      }
      
$rsimage=imagecreatetruecolor($rsdim,$rsdim);
      
imagecopy($rsimage,$src_img,0,0,$rsxstart,$rsystart,$rsdim,$rsdim);
      
imagejpeg($rsimage,$dir."/tmp-".$image[2],85);
      
imagedestroy($rsimage);
      
imagedestroy($src_img);
      
$src_img ImageCreateFromJPEG($dir."/tmp-".$image[2]);
      
$thumb2 imagecreatetruecolor($thumbdim,$thumbdim);
      
imagecopyresampled($thumb2,$src_img,0,0,0,0,$thumbdim,$thumbdim,$rsdim,$rsdim);
      if (!
is_dir($dir."/cache/")) {
        
mkdir(strtolower($dir."/cache"),0777);
      }
      
imagejpeg($thumb2,$cachebild,85);
      
imagedestroy($thumb2);
      
unlink($dir."/tmp-".$image[2]);
      
$finalimage=$finalimage."|".$cachebild;
      
imagedestroy($src_img);
      return 
$finalimage;
    }
    
// Ende Makethumb Funktion 
PeFro ist offline   Mit Zitat antworten
Alt 30-08-2004, 17:52   #6 (permalink)
flachzange
 
Benutzerbild von elias
 
Registriert seit: Jun 2003
Ort: berlin
Beiträge: 3.932
uiuiui
nicht so den durchblick. wieso machste denn da soviele bilder auf?
das sollte doch mit dem öffnen des orginalbildes völlig reichen,
dann arbeitest du dich von groß nach klein runter.
__________________
elias ist offline   Mit Zitat antworten
Alt 30-08-2004, 18:01   #7 (permalink)
Neuer User
 
Registriert seit: Aug 2001
Beiträge: 147
aaaaaaaaaaalso

in skript-reihenfolge:

$src_img = da wird das hochgeladene Ursprungsbild reingeladen
$thumb = (dummer Name) das is das skalierte Ursprungsbild ($src_img)
$rsimage = "goldener Schnitt" vom skalierten Ursprungsbild ($thumb)
$src_img = $rsimage (das könnt ich wahrscheinlich weglassen)
$thumb2 = thumbnail vom "neuen" $src_img also $rsimage


Habs mal ausprobiert und das vorletzte bild weggelassen und direkt $rsimage genommen, hat aber leider auch nix gebracht.
Gibts nich ne Möglichkeit sich den verbrauchten Arbeitsspeicher ausgeben zu lassen oder selber zu berechnen?

Geändert von PeFro (30-08-2004 um 18:12 Uhr)
PeFro ist offline   Mit Zitat antworten
Alt 30-08-2004, 18:16   #8 (permalink)
flachzange
 
Benutzerbild von elias
 
Registriert seit: Jun 2003
Ort: berlin
Beiträge: 3.932
naja ich würde versuchen nur das originalbild zu öffnen, weil jedes öffnen
php ne menge arbeit macht.
eigentlich sollte aber der speicher freigegeben werden, es könnte aber das
das es ein bug ist, der hier sieht ziemlich ähnlich aus:

http://bugs.php.net/bug.php?id=29558&edit=1
__________________
elias ist offline   Mit Zitat antworten
Alt 30-08-2004, 18:25   #9 (permalink)
flachzange
 
Benutzerbild von elias
 
Registriert seit: Jun 2003
Ort: berlin
Beiträge: 3.932
so pi mal daumen könntest du den arbeitsspeicher berechenen wenn du
alle benutzten bilder mit der imagegd2() funktion abspeicherst, das ist
das rohe format womit gearbeitet wird, übrigens ganz nützlich wenn
du einzelne bilder öfter laden musst.
ansonsten vielleicht irgendwelche debugger oder so:
http://pecl.php.net/package/Xdebug
aber das bringt dir in dem falle nicht viel, ansoch von php aus
weis ich da keine möglichkeit.
__________________
elias ist offline   Mit Zitat antworten
Alt 30-08-2004, 18:27   #10 (permalink)
Neuer User
 
Registriert seit: Aug 2001
Beiträge: 147
ich müsste ja mind. 2 bilder öffnen, original und zielbild
an den bug glaub ich auch nicht wirklich
was mich am meisten irritiert... ich habe jetzt alles nach dem ersten imagecreateFromJPEG() auskommentiert und der Fehler kommt immernoch
habe mir vor dem befehl mal den benutzten speicher ausgeben lassen und bekomme "375392" also knapp 400kB, danach kann ich nix mehr ausgeben lassen, weil das script ja direkt nach dem imagecreatefromjpeg abkackt
wie in aller Welt schafft er es dann von einem ~ 630kB jpg nach einem Aufruf 12 MB Speicher zu belegen??

ich checks nich...

edit: der befehl für den belegten speicher is übrigens memory_get_usage() ab PHP 4.3.2 wie ich gerade gelesen hab

Geändert von PeFro (30-08-2004 um 18:29 Uhr)
PeFro ist offline   Mit Zitat antworten
Alt 30-08-2004, 18:37   #11 (permalink)
flachzange
 
Benutzerbild von elias
 
Registriert seit: Jun 2003
Ort: berlin
Beiträge: 3.932
vielleicht liegts am bild mal nen anderes nehmen oder einmal mit PS öffnen,
mit und ohne progressiv testen.
kann ja sein das der speicher noch immer von vorherigen bildern belegt ist?!?
kannst ja mal local mit der CLI version testen und gucken wie/ob sich der
speicher hochschaukelt.

so jetzt muss ich aber einen trinken gehen
__________________
elias ist offline   Mit Zitat antworten
Alt 31-08-2004, 10:43   #12 (permalink)
Neuer User
 
Benutzerbild von chriloi
 
Registriert seit: Nov 2002
Ort: Wien
Beiträge: 449
Also ich denke es könnte evtl. daran liegen, dass der Server auf dem Dein Shared-Host untergebracht ist bisher nicht voll ausgelastet war und deshalb Dein Skript anstandslos lief.

Jetzt haben die lieben Administratoren noch ein "paar" shared-Hosts mit draufgeknallt und plötzlich steigt der insg. Speicherverbrauch an.

Es funktioniert "glaube ich" so, dass man nicht jedem shared-host einen eigenen Speicher-Bereich zur Verfügung stellt, sondern sich dies nur für alle zusammen einstellen lässt. D.h., dass die ~12MB für sagen wir mal 1000 shared-hosts zur Verfügung steht. Natürlich geht der Hoster davon aus, dass von diesen 1000 shared-hosts maximal ~5 wirklich im gleichen Zeitrahmen angesurft werden und in diesem Fall jedem shared-host 2,4 MB Ram zur verfügung stehen. EISKALTE KALKULATION.

Ich hatte vor ein paar Monaten das gleiche Problem, einzige Lösung war zu einem Hoster zu wechseln, bei dem das Verhältnis von zugewiesenem Speicher zu Anzahl der User besser proportioniert ist.

Bei mir ist es kein Problem ein 2MB JPEG File in einem Arbeitsschritt zu verkleinern, überblenden und dann noch ein Thumbnail zu erstellen. Wo mein alter Hoster schon bei einem File über 100kb Schwierigkeiten gemacht hat.

Also lange Rede kurzer Sinn, Du musst wahrscheinlich zu einem Hoster wechseln, der Dir zumindest indirekt garantieren kann, dass Dir genügend Ram zur Verfügung steht.

Ich habe auf www.all-inkl.com gesetzt und fahre damit sehr gut!
chriloi ist offline   Mit Zitat antworten
Alt 31-08-2004, 12:40   #13 (permalink)
Neuer User
 
Registriert seit: Aug 2001
Beiträge: 147
Das hab ich mir schon fast gedacht...
War sowieso kurz vor nem Umstieg, weil ich im letzten Monat ca. 3-4 Tage Komplettausfall oder aber mysql down hatte...nich dass das die Monate vorher wesentlich besser gewesen wäre.
Ist immer verdammt schwer bei den "kleineren" günstigen Anbietern langfristig solides Hosting zu finden

Danke nochmal an alle

PeFro
PeFro ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

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 sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 14:23 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele