Fabienne: ImageDestroy zwingen nötig?

Hallo und guten Abend zusammen,

ich aber derzeit viel mit Grafikbearbeitung online.
Ist nach dem Bearbeiten von Grafiken via PHP der Aufruf der Funktion inmagedestroy unbedingt nötig, oder werden nach Abschluss des Scripts die Speicherressourcen wieder automatisch freigegeben?

Vielen Dank für Eure Infos!

  1. Moin!

    Ist nach dem Bearbeiten von Grafiken via PHP der Aufruf der Funktion inmagedestroy unbedingt nötig, oder werden nach Abschluss des Scripts die Speicherressourcen wieder automatisch freigegeben?

    Kümmerst du dich um die restlichen Variablen? Datenbankergebnisse? Den Ausgabepuffer etc.? Wohl auch nicht. Und wird der RAM-Speicher des Servers immer voller? Auch nicht.

    Ergo... Am Skriptende wird sämtlicher benutzter Speicher freigegeben. Zwischendurch manuell dafür zu sorgen kann aber trotzdem sinnvoll sein, weil Bilder in der Regel recht groß sind und bei der gdlib ja unkomprimiert im Speicher liegen.

    - Sven Rautenberg

    --
    My sssignature, my preciousssss!
  2. 你好 Fabienne,

    ich aber derzeit viel mit Grafikbearbeitung online.
    Ist nach dem Bearbeiten von Grafiken via PHP der Aufruf der Funktion
    inmagedestroy unbedingt nötig, oder werden nach Abschluss des Scripts die
    Speicherressourcen wieder automatisch freigegeben?

    Die Ressourcen werden zwar nach Script-Ende wieder freigegeben, aber das
    heisst nicht, dass du nicht ImageDestroy() aufrufen solltest, sobald du
    das Bild nicht mehr brauchst. Stell dir vor, du hast pro Sekunde 10
    Besucher, jeder fragt 10 Bilder ab, das sind 10x10 Requests pro Sekunde.
    Der Einfachheit halber nehmen wir weiter an, dass jedes bild 640x480 Pixel
    gross ist; das heisst in der GD-Lib, für jedes Bild wird
    640 * 480 * 4 Byte = gerundet 1,17MB * 10 = 117MB pro Sekunde. Das ist
    schon ziemlich viel Speicher. Deshalb ist es wichtig, dass du den Speicher
    freigibst, sobald du ihn nicht mehr benötigst.

    Natürlich macht es keinen Unterschied, wenn dein Script das Bild eh erst
    ganz am Ende freigeben würde, aber man sollte trotzdem darauf achten. Es
    ist schliesslich kein Aufwand, wenn man mal eben ImageDestroy() aufruft,
    bevor man andere Arbeiten, etwa Aufräum-Arbeiten oder so, macht.

    再见,
     克里斯蒂安

    --
    Neuer alter Plasma-Bildschirm | Meine Schultüte
    Fatal! Ich kann kein Reserve-Offizier mehr sein!
    http://wwwtech.de/
  3. Hi!

    ich aber derzeit viel mit Grafikbearbeitung online.
    Ist nach dem Bearbeiten von Grafiken via PHP der Aufruf der Funktion inmagedestroy unbedingt nötig, oder werden nach Abschluss des Scripts die Speicherressourcen wieder automatisch freigegeben?

    Wenn das Skript fertig abgearbeitet wurde, wird der Speicher automatisch freigegeben, d.h. du bräuchtest dich darum _eigentlich_ nicht kümmern. Solltest du jedoch in einem Skript mit mehreren Bildern arbeiten (z.B. mehrere Bilder sollen verkleinert werden), so musst du unter Umständen sogar imagedestroy() benutzen, da sonst das in der php.ini gesetzte memory_limit überschritten wird.

    Darüber hinaus ist es einfach guter Stil, den für eine bestimmte Operation benötigten Speicher wieder freizugeben, sodass du imagedestroy auf alle Fälle benutzen solltest.

    Grüße,
    Fabian St.

    1. Hi Fabian,

      wie steht es um die Bildvariablen innerhalb von Funktionen?
      Globale-Vars sind bei ausgeschaltet => eigentlich sollten die Vars ja nach Ende der Funktion wieder gelöscht werden.

      Problem bei mir ist folgendes:
      Ich habe eine Skalierfunktion, die als Rückgabewert das Bild zurückgibt (return $neues_bild;). Anschließend wird in einer anderen Funktion das Bild abgespeichert bzw. ausgegeben.

      Meines Wissens nach werden Funktionen beim Erreichen von return abgeschlossen. D.h. ich _kann_ meinenicht globale Variable $neues_bild gar nicht mehr löschen :-(

      Habe ich das richtig verstanden?

      Grüße Fabienne

      1. hi,

        Ich habe eine Skalierfunktion, die als Rückgabewert das Bild zurückgibt (return $neues_bild;).

        Diese Rückgabe legst du dir sicherlich in einer Variablen ab - damit du überhaupt noch Zugriff auf diese Bildressource hast.

        Meines Wissens nach werden Funktionen beim Erreichen von return abgeschlossen. D.h. ich _kann_ meinenicht globale Variable $neues_bild gar nicht mehr löschen :-(

        Du kannst imagedestroy mit der Variablen als Parameter aufrufen, in der du die Funktionsrückgabe abgelegt hast - denn diese enthält ja nach wie vor die Ressource-ID des Bildes.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }