Carbage Collector für PHP

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

  • #16
    Wenn Du schnell zu Ergebnissen kommen willst, ist die Lösung der Wahl, finde ich, Quetschis Vorschlag. Die 5000 Operationen in z.B. 50 Skriptaufrufe á 100 Operationen aufstückeln. Das ist auch gut für die Zukunft, weil Dein System dann auch auf Servern laufen kann, bei denen das Memory-Limit festgelegt ist.

    Ansonsten ist die Diskussion um einen Garbage-Collector natürlich sehr interessant!...

    Kommentar


    • #17
      Auf einen echten GC wurde bei PHP wohl verzichtet, weil Scripte im Schnitt nur kurz laufen und dabei nur verhältnismäßig wenig Speicher benötigen.
      Einzig die Sessiondateien überleben i.d.R. den Ausführungszyklus und dafür gibt es bekanntlich eine Art Garbage Collection.

      Was wir hier sehen (25000 Bilder konvertieren) ist ein Extremfall, der nicht der Philosophie der "kurzen Laufzeit bei wenig Speicherverbrauch" entspricht. Aber auch da gibt es schließlich Mittel und Wege; PHP ist von seiner Architektur und Ausstattung her flexibel genug.

      Eine Möglichkeit wurde bereits genannt: Die lange Laufzeit in kurze aufteilen, also das Script sich selbst immer wieder aufrufen lassen (mit Übergabe eines Startwertes). Der belegte Speicher wird bei Speicherknappheit sofort freigegeben, wenn das aufrufende Script beendet wurde. Wenn man diesen Ansatz wählt, sollte man (wie ebenfalls schon erwähnt) die Aufteilung gleich so wählen, dass sie den gängigen Serversettings entspricht oder zumindest irgendwie variabel halten.

      Eine weitere Möglichkeit: Ein Script agiert nur als Prozessmanager, hat mit Bildern also selbst überhaupt nichts am Hut. Es läuft in einer Schleife, startet jeweils ein anderes Script, das die Bildkonvertierung übernimmt (wieder mit Übergabe eines Startwertes) und wartet dann auf dessen Beendigung. Dabei könnten sich die
      Prozesskontrollfunktionen von PHP als nützlich erweisen. Es ginge aber wahrscheinlich auch mit einfachem shell_exec().

      Noch eine Möglichkeit wäre - und hier verlassen wir die reine PHP-Welt - ein Script, dass ein auf dem Server abgelegtes Programm startet und dann eine Seite ausgibt "ist in Arbeit". Die Seite lädt sich jede Minute neu, das Script schaut (z.B. mit ps) ob das gestartete Programm noch läuft. Dieses Programm könnte dann in einer Sprache geschrieben sein, die einen GC mitbringt oder in der er sich implementieren läßt.
      Zuletzt geändert von onemorenerd; 20.08.2005, 13:25.

      Kommentar


      • #18
        Ich habe einige Speicherlecks ausgemacht ...
        Zum Beispiel wird bei einem "file_exists()" das Ergebniss gecacht ...
        Man muss explizit die Funktion "clearstatcache()" aufrufen, um den Cache zu leeren ...
        Auch bei Funktionen wie fgets() oder fread() wird hin und wieder Speicher belegt, welcher dann nicht wieder freigegeben wird, obwohl das hande danach wieder geschlossen und mit unset gelöscht wurde ...

        Die einfachste und sicherste Möglichkeit war bei mir jetzt schlicht und einfach, von meinem "Hauptskript" aus für jeweils 1000 zu konvertierende Bilder ein anderes php-Skript mittels passthru aufzurufen ...
        Ist zwar nicht die feine Art, so einem Kommandozeilen Aufruf mal eben 1000 Parameter anzuhängen, aber ne andere Möglichkeit fiel mit auf die Schnelle nicht ein ...

        Danke erstmal für eure Hilfe(n) und Tips!

        Gruß
        Steffen

        Kommentar

        Lädt...
        X