PHP: Session- und Prozessmanagement



  • Hallo Leute,

    also ich hab 2 Fragen an euch. Ich probiers mal kurz zu beschreiben:

    1.:
    Unser mit symfony erstelltes Projekt, bietet die Möglichkeit Dateien hochzuladen. Diese sollen nur über die Dauer der Session gespeichert werden. Wir laden diese in einen Ordner hoch, der ganz einfach den Namen der aktuellen SessionID hat. Jetzt wollen wir einen CronJob laufen lassen (auch PHP Skript), welcher alle alten Dateien und Ordner löscht. Dazu müssen wir aber vom Webserver (Apache) wissen, welche SessionIDs noch gültig sind, und welche abgelaufen.

    Wie finden wir das raus? Bietet der Apache eine passende API (am besten für PHP)?

    2.:
    Das Projekt ist ein spezieller Mailverteiler. Sobald der Benutzer die Mails verschickt, soll ein eigener Prozess gestartet werden, welcher die emails verschickt. Damit wollen wir einen Timeout des Skripts verhindern und eine schnelle Ausführung garantieren.

    Wie aber startet man einen Prozess? exec() scheint bis zum Beenden des Sohn-Prozesses zu blockieren, aber das sollte nicht sein.

    Schonmal vielen Dank im voraus!



  • Ich kenne zwar eure Anwendung nicht, aber warum gibt ihr der Session nicht gleich nur eine begrenzte Lebensdauer.

    Oder ihr speichert sie in einer DB, bei erneuten Zugriff den Timestring aktualisieren und per Cron alles löschen was älter als X ist.
    Genau so gut könnte man es mit dem Verzeichnis oder den jeweiligen Dateien machen, sollten sie älter als X Time sein, dann löschen.



  • Naja, wir wollen ja nicht die Session an sich löschen, sondern Dateien auf dem Server. Diese Dateien speichern wir aber nicht in der Session ab. Diese einfach zu löschen wenn sie älter als X Sekunden/Stunden/Tage sind, ist zwar möglich, aber nicht gerade der "schöne" Weg.


  • Mod

    session.save_path sagt wo die session daten liegen. uU hilft das.

    Ansonsten einfach eigene session.save_handler schreiben die korrekt aufräumen...
    ein hook um sich in den GC einzuhängen kenne ich leider nicht.

    proc_open/popen

    oft ist es auch sinnvoll einen request an ein anderes script zu schicken - je nach dem halt



  • Das ist mir schon klar das ihr keine Daten in der Session speichern wollt.

    Wenn eine Aktion vom jeweiligen Benutzer im Script ausgeführt wird, wird in der DB der Timestamp der SessionID aktualisiert.
    Jetzt prüft euer Cronscript alle paar Minuten welche Session ID eine gewisse Zeit nicht mehr aktualisiert wurde und löscht dieses Verzeichnis mit Inhalt.

    Das ist das gleiche was ihr haben wollt, so macht man das eigentlich, oder man gibt der Session gleich am Anfang nur eine gewisse Lebenszeit.



  • @ Shade Of Mine:
    Danke, die beiden Infos bringen mich weiter.

    @ Vitamin-C:
    Ich denke ich hab dich vorhin etwas falsch verstanden. Aber jetzt hab ichs kapiert, und wie wir es implementieren wird sich zeigen.

    Danke euch beiden!



  • Muss denn überhaupt das Verzeichnis sofort nach Beendigung der Session gelöscht werden, man kann doch im Grunde einmal am Tag die alten Daten löschen.
    Wie gesagt, ich weiss nicht den Ablauf eures Scriptes, aber würde es denn so stören wenn die Verzeichnisse und Dateien ein paar Stunden auf dem Server verbleiben würden.



  • Ich hab doch nie behauptet, dass _sofort_ aufgeräumt werden muss. Wir haben vor jede Nacht aufzuräumen. Aber zu diesem Zeitpunkt müssen wir eben die aktiven und abgelaufenen Sessions voneinander unterscheiden können. Deswegen die Frage, wie wir auslesen können welche Sessions noch aktiv sind.



  • Das hatte ich so verstanden, aber nun gut..
    Nur dann ist die Sache auch noch viel einfacher, fügt einfach zu eurem Verzeichnisnamen den Timestamp hinzu und löscht dann nur die älteren gewünschten Einträge.
    Es würde eventuell auch reichen, wenn ihr nur mit dem reinen Erstellungszeitpunkt des Verzeichnisses arbeitet.



  • Genau das meinte ich in meinem zweiten Beitrag, mit dem 'nicht so "schönen" Weg'.

    Nehmen wir an, die Session wird irgendwann mal unbeschränkt lange gültig sein, dann würden wir eventuell aufräumen (Ordner und Daten löschen), obwohl diese noch gebraucht werden. Besser wäre es daher, mit der Session ID zu arbeiten (also nachschauen, ob sie noch aktiv ist oder eben nicht).


Anmelden zum Antworten