Carbage Collector für PHP

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Carbage Collector für PHP

    Hallo,

    ich habe ein Skript geschrieben, welches eine ganze Menge von Bildern convertiert und Thumbnails erzeugt ...
    Leider schmiert das Skript nach nem halben Tag ungefähr ab und meldet jedesmal, dass kein Speicher mehr reserviert werden konnte (Limit ist auf 300 MB gesetzt, und die sind halt voll!) ...

    Habe schon versucht mit unset vor der Bearbeitung eines jeden Bildes alle Variablen wieder frei zu geben, half aber auch nicht ... :-(

    Gibt es für php vielleicht sowas wie den Carbage Collector für Java!?
    Achso, es geht um php 4.3 ...

    Danke
    Steffen

  • #2
    Hallo,

    was meinst genau mit dem 300MB Limit? die Memorysize in der php.ini? Oder ist das dein verfügbarer Plattenplatz?

    Ansonsten:
    Falls du mit der GD-lib arbeitest - speicher freigeben mit www.php.net/imagedestroy
    Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
    Schön - etwas Geschichte kann ja nicht schaden.
    Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

    Kommentar


    • #3
      Mit den 300 MB Limit meine ich die den maximal erlaubten Speicherverbrauch des php-Skriptes ... also die Option:

      memory_limit = 300M

      In der php.ini!

      Kommentar


      • #4
        das ganze läuft ja bestimmt in'ner schleife,ich würd mir einfach mal nach nem durchlauf
        mit var_dump(get_defined_vars()) ausgeben lassen, was für variablen so alles noch im speicher rumgammeln.
        sowas wie
        PHP-Code:
        $dv=get_defined_vars();
        foreach(
        $dv as $k=>$v)unset(${$k}); 
        wär doch mal lustig, oder?

        wenn das ganze rekursiv läuft, könnte auch die menge der funktionsaufrufe das problem sein, dann mußt du wohl oder übel auf schleifen umsteigen.
        eval(str_pad(aa|db,4,slarti^~äü_i_)." \"áú¾ïùû䶳Ðäýï©üèíþç£þé\"^~\"no bugs, only features\";");

        Kommentar


        • #5
          Re: Carbage Collector für PHP

          Original geschrieben von Boemm
          ich habe ein Skript geschrieben, welches eine ganze Menge von Bildern convertiert und Thumbnails erzeugt ...
          mit der GD-lib? Du musst die Bilder hinterher mit image_destroy() abschießen...

          Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

          bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
          Wie man Fragen richtig stellt

          Kommentar


          • #6
            Die Konvertierung wird über ImageMagick vorgenommen ...
            Ausserdem wird noch ein Flash erzeugt mittels einem externen Kommandozeilenprogramm namens png2swf ...

            Also kein GD ... gibt es bei diesen Programmen vielleicht bekannte Speicher-Probleme bzw. Probleme mit nicht freigegeben Objekten oder so!?

            Steffen

            Kommentar


            • #7
              nö, selbst wenn es so wäre würde es PHP nicht interessieren. Irgendwo in deinem Script hast ne Var oder Array das irgendwann vollläuft - tipp von slarti beachten.
              Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
              Schön - etwas Geschichte kann ja nicht schaden.
              Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

              Kommentar


              • #8
                Hm, habs mal versucht mit der Variante

                $dv=get_defined_vars();
                unset($dv['dv']);
                echo "dv\tLenght\t" . sizeof($dv) . "\t" . strlen(serialize($dv)) . "\n";

                und das mal bei jedem Bild ausgeben lassen ...
                Ausser ein paar Byte änderte sich die Ausgabe nicht ...
                Sprich (wenn ich es richtig verstanden habe) müsste der Speicherverbrauch der definierten Variablen ja etwa auf dem gleichen Level geblieben sein, oder!?

                Daher verstehe ich nicht, warum mir der Speicher so voll läuft ...

                Das folgende Ergebniss kam bei obiger Ausgabe für ein paar Bilder:

                Code:
                pic: 730.jpg
                defined vars:   count: 43 elements      strlen: 17837
                
                pic: 156f3.jpg
                defined vars:   count: 45 elements      strlen: 18227
                
                pic: 1bd27.gif
                defined vars:   count: 45 elements      strlen: 18223
                
                pic: 21201.png
                defined vars:   count: 45 elements      strlen: 18236
                
                pic: 43fd4.jpg
                defined vars:   count: 45 elements      strlen: 18226
                
                pic: 5ff75.jpg
                defined vars:   count: 45 elements      strlen: 18224
                
                pic: 60209.jpg
                defined vars:   count: 45 elements      strlen: 18214
                
                pic: 60211.jpg
                defined vars:   count: 45 elements      strlen: 18222
                
                pic: 370.gif
                defined vars:   count: 45 elements      strlen: 18212
                
                pic: 373.gif
                defined vars:   count: 45 elements      strlen: 18208
                
                pic: 1202.jpg
                defined vars:   count: 45 elements      strlen: 18214
                
                pic: 1205.jpg
                defined vars:   count: 45 elements      strlen: 18217
                
                pic: 1208.jpg
                defined vars:   count: 45 elements      strlen: 18214
                
                pic: 120c.gif
                defined vars:   count: 45 elements      strlen: 18218
                
                pic: 120f.gif
                defined vars:   count: 45 elements      strlen: 18216
                
                pic: 1212.jpg
                defined vars:   count: 45 elements      strlen: 18206
                
                pic: 1224.jpg
                defined vars:   count: 45 elements      strlen: 18206
                
                pic: 1227.jpg
                defined vars:   count: 45 elements      strlen: 18214
                
                pic: 1248.jpg
                defined vars:   count: 45 elements      strlen: 18212
                
                pic: 124b.jpg
                defined vars:   count: 45 elements      strlen: 18210
                
                pic: 177b.jpg
                defined vars:   count: 45 elements      strlen: 18206
                
                pic: 1c37.jpg
                defined vars:   count: 45 elements      strlen: 18212

                Kommentar


                • #9
                  Poste mal die Fehlermeldung, so wie du sie auf dem Bildschirm bekommst.
                  Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
                  Schön - etwas Geschichte kann ja nicht schaden.
                  Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

                  Kommentar


                  • #10
                    Es kmmt lediglich:

                    Code:
                    Fatal error: Allowed memory size of 314572800 bytes exhausted (tried to allocate 6960 bytes)
                    in /mnt/spreadomat/stage/spreadomat/classes/functions/ss_image.inc.php on line 94
                    Allerdings tritt sie halt auch an verschiedenen Stellen und in verschiedenen Dateien auf ...
                    Mal direkt bei ImageMagick, mal ganz woanders ...

                    Kam mal an einer Stelle, wo einfach nur einer Variable ein String zugeordnet werden sollte, diese Stelle hier ist einfach nur ein Kommentar in der php Datei:

                    Code:
                    Zeile Code
                    91 /**
                    92 *	constructor
                    93 *
                    94 *	Alle mit uebergebenen Parameter werden als Objekteigenschaften gesetzt.<br>
                    95 *	Notwendig ist nur ein src-path<br>
                    96 *
                    Hab jetzt mal eine Funktion eines anderen Postings genommen und den Speicherverbrauch des Skripts berechnen lassen, dabei kamen folgende Byte-Werte für die fortlaufende Schleife raus:

                    Code:
                    11992
                    12048
                    12120
                    12184
                    12240
                    12300
                    12356
                    12412
                    12476
                    12540
                    12596
                    12652
                    12712
                    12772
                    12836
                    12892
                    12948
                    13004
                    13064
                    13120
                    13176
                    Steigt also kontinuierlich an ...
                    Sind zwar nur durchschnittlich 60 Byte pro Durchlauf und scheint auf den ersten Blick nicht viel, aber bei 5000 Bildern sind die 300 MB geknackt!
                    Und ich habe so bei 25000 zu convertieren ...
                    Zuletzt geändert von Boemm; 18.08.2005, 16:34.

                    Kommentar


                    • #11
                      Original geschrieben von Boemm
                      Steigt also kontinuierlich an ...
                      dann finde den Grund warum....zwischenwerte ausgeben sollte helfen...

                      Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                      bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                      Wie man Fragen richtig stellt

                      Kommentar


                      • #12
                        Finde den Grund ist gut ...
                        Ich habe doch die Größe aller definierten Variablen meines Skriptes parallel dazu verglichen und da steigt der Verbrauch nicht an!

                        Ist vielleicht ein vorzeitiger Schluß, aber das sieht so aus, als ob dieser Speicheranstieg nicht von "innerhalb" des Skripts kommt ...

                        Und an der Stelle hörts bei mir auf ...
                        Weiss nicht wo ich dann schauen soll, was für ein Objekt oder was auch immer immer mehr Speicher verbraucht ...

                        Kommentar


                        • #13
                          Auch an dich der Hinweis bei Benutzung der PHP- oder CODE-Tags Zeilenumbrüche reinzueditieren, was das bei Nichtbeachtung für Folgen haben kann siehst du hier

                          2 Möglichkeiten:

                          1. Du findest Mittel und Wege die Var zu ermitteln, die den Überlauf verursacht und setzt die ggf. in der Schleife zurück.


                          Vielleicht etwas einfacher aber auch etwas ungelenkiger:
                          2. Du baust was ein, dass sich das Script meinetwegen nach 100 Schleifendurchläufen von selbst aufruft und einen Startwert übergibt, mit dem du an der richtigen Stelle wieder weitermachst. Dadurch sollte der Speicher immer wieder freigegeben werden.
                          Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
                          Schön - etwas Geschichte kann ja nicht schaden.
                          Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

                          Kommentar


                          • #14
                            1. Du findest Mittel und Wege die Var zu ermitteln, die den Überlauf verursacht und setzt die ggf. in der Schleife zurück.
                            ...wie gesagt, es muß ja nich unbedingt ne var sein.
                            bei rekursionen steigt der speicherbedarf auch stetig an
                            oder zb. bei nicht wieder freigegebene ressource-handles wie zb. von dir()...
                            eval(str_pad(aa|db,4,slarti^~äü_i_)." \"áú¾ïùû䶳Ðäýï©üèíþç£þé\"^~\"no bugs, only features\";");

                            Kommentar


                            • #15
                              bei nicht wieder freigegebene ressource-handles
                              eben. die lassen sich afaik auch nicht mittels serialize() und strlen() erfassen.

                              Kommentar

                              Lädt...
                              X