Wodurch Prozess starten ?
Martin Hein
- php
0 Rafael0 Rafael0 Martin Hein0 Rafael0 Martin Hein0 Rafael0 Martin Hein0 Rafael
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
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.
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.
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
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.
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
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.
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
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.