Martin Hein: Wodurch Prozess starten ?

Hallo Forum,

ich will versuchen folgendes realisieren:

Ein User meldet sich auf einer Webapplikation an
(selbstgebasteltes CMS) und führt seine Arbeiten
durch. Wenn er damit fertig ist, soll automatisch
durch den Server eine Mail generiert werden. Wenn
ich davon ausgehen könnte, dass der User sich in
jedem Fall abmeldet (und damit die Session zerstört),
könnte ich den Prozess leicht nutzen, um die Mail
per PHP zu verschicken.

Leider kann ich aber nicht davon ausgehen. Also
müsste die Mail dann generiert werden, wenn die
Session abgelaufen ist.

Hat jemdand einen Tipp, wie das gehen könnte ?
Mir fällt nur ein "Conjob" ein. Kriegt man das
damit hin ?

danke für eure tipps und

beste gruesse,
martin hein

  1. Du könntest einen Cronjob starten, der sich alle paar Minuten das Verzeichnis in dem die Session gespeichert wird ansieht. (Konfiguration in der php.ini mittels "session.save_path")

    Dort werden die Sessioninformationen der einzelnen Nutzer serialisiert gespeichert und im Fall einer zerstörten Session wieder herausgenommen.
    Dein Programm puffert nun diese Informationen und sobald eines davon automatisch verschwindet, ohne dass sie zerstört wurde verschickt das Programm die von dir gewünschte Email.
    (Diese durch ausloggen zerstörten Session-IDs musst du deinem Programm natürlich vorher mitteilen, sonst weiß es nicht welche Dateien automatisch verschwinden. Und Achtung: Das Setzen eines Session-Wertes wie $_SESSION['login']=false zerstört die Session nicht, sie modifiziert sie nur.)

    Je kürzer du die Rythmen für das Auslesen des Verzeichnisses allerdings setzt, desto rechenintensiver wird deine Anwendung.
    (Am besten nimmst du für den Rythmus "session.gc_maxlifetime" [bzw. gibt es ein minlifetime?] abzüglich eines kleinen Sicherheitsabstandes, den dein Programm für das Auslesen des Verzeichnisses benötigt.)
    Fraglich ist auch, ob du alle Sessioninformationen speicherst (Dein Session-Verzeichnis also spiegelst) oder ob du dir nur die Dateien selbst merkst (Name in der Regel sess_[SESSION-ID]) + deiner Cron-Anwendung zusätzlich beim Login auch die für sie relevaten Informationen mitteilst.

    Sobald dein Programm also feststellt, dass eine geloggte Session zerstört wurde (Also die Datei sess_[Geloggte Session-ID] nicht mehr existiert) ohne dass dieses zerstören explizit beim Ausloggen genehmigt wurde, muss dein Cron diese Routinen selbst nachholen.

    Hoffe die Idee ist nachvollziehbar und bringt dich weiter.
    Grüße.

    1. Ergänzung:
      Je nach Art und Umfang deines Servers kannst du natürlich auch ein Programm mit einer Laufzeit nutzen (also kein PHP - die Wahl fiele dann auf Java, C#, ...), um das gleiche zu erledigen. Das wäre in meinen Augen sogar vorzuziehen, da es vermutlich weniger Ressourcen verbraucht als ein so häufiger Cron.

      Die Vorgehensweise ist natürlich die gleiche, wobei die php.ini für die benötigten Informationen auszulesen ist.

      1. Hallo Rafael,

        beim ersten Lesen klingt Dein Ansatz schlüssig. Ich werde ihn
        ein paar mal lesen müssen, um ihn zu verinnerlichen. Dazu kommt,
        dass ich nur grundsätzlich weiss, was ein Cronjob ist, aber
        keinerlei Erfahrung damit habe, wie der funktioniert. Deshalb
        lese ich mir das erstmal an und versuche, Deine Idee dann
        nachzuvollziehen. Wenn ich dann fragen dazu habe, poste ich
        sie hier.

        Danke und

        viel gruesse,
        martin

        1. Dazu kommt, dass ich nur grundsätzlich weiss, was ein Cronjob ist, aber keinerlei Erfahrung damit habe, wie der funktioniert.

          Um dir diese sorge gleich abzunehmen: Ein Cronjob kann alles sein. Auch ein PHP-Programm mit dem du ja scheinbar arbeitest. Alles was in deinem CronTab abgelegt ist (jedes Unix-System hat zum Beispiel einen Ordner für solche Belange, Server hin oder her.) wird in dem im CronTab gespeicherten Rythmus ausgeführt.

          Schreibe also ein PHP-Programm, dass die gewünschten Routinen durchlöuft und fühe dies deinem Crontab hinzu.

          1. Hi,

            OK, Der Cronjob an sich war kein Problem:

            Ich habe ein php-Script geschrieben, dass eine Datei anlegt.
            Der Dateiname wird aus date(); generiert. Das Script liess
            sich auf dem Server per Konsole aufrufen:

            D:\Programme\xampp\php>php Z:\htdocs\root\writefile.php

            ... und hat eine Datei angelegt. Statt des Aufrufs über die
            Konsole habe ich dann einen "geplanten Task" angelegt, der
            das Script anstösst (Dummerweise weiss ich noch nicht ob/wie
            ich über den Taskplaner den Task alle paar Minuten anstossen
            kann. Möglicherweise muss ich mal nach einem alternativen Tool
            gucken).

            Jetzt fange ich jedenfalls an, mich mit der Logik des Scripts
            nach deinem Vorschlag zu befassen:

            Das Script soll (regelmässig) in das SESSION-Verezichnis gucken,
            alle Informationen puffern, also alle SESSION-Informationen
            kopieren und die Kopie mit dem Original vergleichen. Der
            Vergleich geschieht, bevor die Kopie erstellt wird.

            Korrekt ?

            Ich kann scheinbar auf das (in der php.ini) definierte
            SESSION-Verzeichnis zugreifen. Ich bin etwas verwundert,
            weil sich darin richtig viele SESSIONs wiederfinden.
            Seis drum. Ich würde nun 'meinen' SESSIONs Namen geben,
            um sie zu erkennen.

            to be continued ...

            beste gruesse,
            martin

            1. Das Script soll (regelmässig) in das SESSION-Verezichnis gucken,
              alle Informationen puffern, also alle SESSION-Informationen
              kopieren und die Kopie mit dem Original vergleichen. Der
              Vergleich geschieht, bevor die Kopie erstellt wird.

              Mit dem Original vergleichen halte ich sogar für unnötig. Dass sich Session-IDs in diesem Zeitraum doppeln ist so unwahrscheinlich wie es nur sein kann.

              Einfach nachsehen, ob die Session noch existiert ist damnach ausreichend und die benötigten Informationen hast du ja gepuffert.

              Grüße.

              1. Mit dem Original vergleichen halte ich sogar für unnötig. Dass sich Session-IDs in diesem Zeitraum doppeln ist so unwahrscheinlich wie es nur sein kann.

                OK, so weit war ich auch noch garnicht und wollte es vielmehr
                allgemein halten. Die Kopie ist der Puffer (wie auch immer
                der aussieht) und das Orininal der Inhalt des SESSION-
                Verzeichnisses.

                Wie sieht der Puffer d.E. aus ?

                ist das 'ne Textdatei, in der der Inhalt des SESSION-Verzeichnisses
                hinterlegt wird ?

                beste gruesse,
                martin

                1. Wie sieht der Puffer d.E. aus ?

                  Kommt sehr auf die Art der Abfrage aus. Wenn du tatsächlich nur die Information benötigst, welcher Nutzer welche Session nicht beendet hat, dann würde ich das in einem (in eine Datei serialisiertem) Array puffern. Wenn du aber tatsächlich sämtliche Session-Informationen benötigst, dann kopiere gleich die ganze Datei und lese sie nur im Fall einer nicht beendeten Session aus. Du ersparst dir dadurch ständiges serialisieren und deseralisieren bei ordnungsgemäß beendeten Sessions, da du die Dateien in dem fall einfach löschen kannst.

                  Grüße.