/ Server / PHP: etwas wie ein "Workerthread"
SorgenKind Mech
- programmiertechnik
0 LSpreee0 SorgenKind Mech0 suit0 SorgenKind Mech0 suit
0 Sven Rautenberg
huhu liebes Forum,
ich bin gerade dabei ein uralten projekt neu zu schreiben
dabei kam es mir in den sinn, verschiedene aufgaben "auszulagern"
ein gutes beispiel wäre das versenden einer e-Mail
bisher habe ich das so gemacht, dass die seite aufgerufen wurde, und dann das script die mail versandt. je nach fortschritt wurde ungepuffert per javascript ein fortschrittsbalken aktualisiert
klar, dass man dabei nicht weiterarbeiten konnte, es sei denn man öffnete eine neue instanz per browser
toll wäre es nun also, wenn ich einfach in ein journal schreibe "sende email mit der id 512"
nun stelle ich mir vor, wie eine art workerthread das journal ständig durchforstet, und dann den eintrag findet und ihn ausführt
somit könnte man also auch eine art aufgabenliste anzeigen, welche auch den fortschritt der verschiedenen aufgaben anzeigt
nun natürlich die spannende frage, wie könnte man sowas realisieren?
ich arbeite mit IIS (Win7) und PHP (FastCGI) / MySQL
im prinzip sollte dieser thread, welcher php-code ausführen sollte, permanent laufen, also nicht erst durch einen seitenaufruf "angeschubst" werden, sodass er halt auch mal nachts aufgaben wie datenbankoptimierungen durchführen kann ...
jemand ne idee oder sowas schonmal gemacht? bin auch gern für alternativen offen, jedoch möchte ich die grundkomponenten schon beibehalten
ein gutes beispiel wäre das versenden einer e-Mail
sollte das Ergebnis des Versendens nicht unmittelbar an das Script zurückgegeben werden?
klar, dass man dabei nicht weiterarbeiten konnte, es sei denn man öffnete eine neue instanz per browser
Ist das nicht a) gut so? b) bei einer Email im Millisekundenbereich?
Wenn Du es nur asynchron (parallel im Hintergrund) machen möchtest, nutze AJAX.
toll wäre es nun also, wenn ich einfach in ein journal schreibe "sende email mit der id 512"
nun stelle ich mir vor, wie eine art workerthread das journal ständig durchforstet, und dann den eintrag findet und ihn ausführt
Nun: warum sollte man das machen? So ist das eben bei der prozeduralen Programmierung und so ist es am effektivsten. Ich finde den gedanklichen Ansatz unpassend. Mit objektorientierter Programmierung (aber auch schon funktionsbasiert) und einem guten Konzept, kann man solche Tasks wunderbar auslagern, dass sie nicht im Script selbst stehen müssen.
somit könnte man also auch eine art aufgabenliste anzeigen, welche auch den fortschritt der verschiedenen aufgaben anzeigt
Logfile schreiben und ausgeben?
im prinzip sollte dieser thread, welcher php-code ausführen sollte, permanent laufen, also nicht erst durch einen seitenaufruf "angeschubst" werden,
Was permanent läuft, verbraucht permanent Ressourcen.
sodass er halt auch mal nachts aufgaben wie datenbankoptimierungen durchführen kann ...
Dafür kannst Du in der Tat Cron Jobs verwenden.
LG,
LSpreee
ein gutes beispiel wäre das versenden einer e-Mail
sollte das Ergebnis des Versendens nicht unmittelbar an das Script zurückgegeben werden?
das ist nicht nötig, es sei denn es tritt ein nicht automatisch behebbarer fehler auf
klar, dass man dabei nicht weiterarbeiten konnte, es sei denn man öffnete eine neue instanz per browser
Ist das nicht a) gut so? b) bei einer Email im Millisekundenbereich?
Wenn Du es nur asynchron (parallel im Hintergrund) machen möchtest, nutze AJAX.
nein schön wäre es wenn ich sage "abschicken" und kann dann im selben fenster ganz normal weiter arbeiten
millisekundenberiech wohl eher nicht, da es sich nicht um reine text-mails handelt, und die internetverbindung dort nicht die schnellste ist, da kann das versenden einer mail schonmal ne minute dauern
mal ganz abgesehen von dem komischen mailserver der nach ca. 80 kb transferdaten ständig whitespaces sendet und ich ständig warten muss
ajax ist sicherlich ein teil dessen, was ich zum beispiel für eine fortschrittsanzeige verwenden möchte
während ich ganz normal weiterarbeite, kann per ajax irgendwo recht unten in der ecke ein fortschrittsbalken laufen, oder eine prozenanzeige
toll wäre es nun also, wenn ich einfach in ein journal schreibe "sende email mit der id 512"
nun stelle ich mir vor, wie eine art workerthread das journal ständig durchforstet, und dann den eintrag findet und ihn ausführt
Nun: warum sollte man das machen? So ist das eben bei der prozeduralen Programmierung und so ist es am effektivsten. Ich finde den gedanklichen Ansatz unpassend. Mit objektorientierter Programmierung (aber auch schon funktionsbasiert) und einem guten Konzept, kann man solche Tasks wunderbar auslagern, dass sie nicht im Script selbst stehen müssen.
im script selbst stehen die prozeduren sowieso nicht
somit könnte man also auch eine art aufgabenliste anzeigen, welche auch den fortschritt der verschiedenen aufgaben anzeigt
Logfile schreiben und ausgeben?
der anwender will sich kein logfile durchlesen, den anwender interessiert nur: was läuft (mail-versandt, db-optimierung, ...), welcher status (in warteschleife, in bearbeitung, fertig bzw. raus aus der liste), sind keine fehler aufgetreten
im prinzip sollte dieser thread, welcher php-code ausführen sollte, permanent laufen, also nicht erst durch einen seitenaufruf "angeschubst" werden,
Was permanent läuft, verbraucht permanent Ressourcen.
das ist korrekt, jedoch ist das denke ich bei einem dediziertem xeon nicht der rede wert ;)
sodass er halt auch mal nachts aufgaben wie datenbankoptimierungen durchführen kann ...
Dafür kannst Du in der Tat Cron Jobs verwenden.
wenn ich mich korrekt belesen habe, ist das linus / unix ...
aber wenn ich mir vorstelle, dass das unter win etwas ähnliches wie die aufgabenplanung ist, dann wäre ja im prinzip das unter umständen auch damit lösbar ...
eine sache muss ich mal festhalten: ich denke ein einzelner workerthread ist nicht unbedingt sinnvoll, sondern es müsste eine instanz eines workerthreads erstellt werden, der sich genau einer aufgabe annimmt
der nächste workerthread sieht nun, dass aufgabe 1 schon in bearbeitung ist, und schnappt sich, sofern vorhanden aufgabe 2, und so weiter
somit geht man auch dem problem aus dem weg: was ist wenn ein workerthread terminiert wird oder abstürzt? ganz einfach: der letzte nachvollziehbare punkt ist ja im journal, also kann nach einer gewissen zeitspanne (jeder workerthread schreibt auch ins journal wann er das letzte mal aktiv war, sagen wir mal alle 5 sekunden) ein neuer workerthread erkennen, dass dort offensichtlich die aufgabe, die zwar von einem thread übernommen wurde, jedoch der thread scheinbar nicht mehr existiert, neu übernommen werden
LG,
LSpreee
LG
mech ;)
Ist das nicht a) gut so? b) bei einer Email im Millisekundenbereich?
Wenn Du es nur asynchron (parallel im Hintergrund) machen möchtest, nutze AJAX.nein schön wäre es wenn ich sage "abschicken" und kann dann im selben fenster ganz normal weiter arbeiten
Und das kannst du etwa nicht, wenn du per XHR ein script anstößt?
ajax ist sicherlich ein teil dessen, was ich zum beispiel für eine fortschrittsanzeige verwenden möchte
Ajax for Fortschrittsanzeigen - also du meinst die Kreise die herumrödeln und nicht zeigen, wie lange es noch dauert? :)
wenn ich mich korrekt belesen habe, ist das linus / unix ...
aber wenn ich mir vorstelle, dass das unter win etwas ähnliches wie die aufgabenplanung ist, dann wäre ja im prinzip das unter umständen auch damit lösbar ...
Der Task Scheduler unter Windows ist ein Dreirad (mit zusätzlichen Stützrädern) während der cron-Daemon ein Motorrad mit über 100 kW ist :p
Es ist das mittel der Wahl für diese Art von Aufgaben.
eine sache muss ich mal festhalten: ich denke ein einzelner workerthread ist nicht unbedingt sinnvoll, sondern es müsste eine instanz eines workerthreads erstellt werden, der sich genau einer aufgabe annimmt
Ich halte nochmal folgendes Fest: Wieso nicht ein Cron-Job, der genau das zu den Zeiten tut, was er tun soll?
der nächste workerthread sieht nun, dass aufgabe 1 schon in bearbeitung ist, und schnappt sich, sofern vorhanden aufgabe 2, und so weiter
somit geht man auch dem problem aus dem weg: was ist wenn ein workerthread terminiert wird oder abstürzt? ganz einfach: der letzte nachvollziehbare punkt ist ja im journal, also kann nach einer gewissen zeitspanne (jeder workerthread schreibt auch ins journal wann er das letzte mal aktiv war, sagen wir mal alle 5 sekunden) ein neuer workerthread erkennen, dass dort offensichtlich die aufgabe, die zwar von einem thread übernommen wurde, jedoch der thread scheinbar nicht mehr existiert, neu übernommen werden
Cron Job?
Ist das nicht a) gut so? b) bei einer Email im Millisekundenbereich?
Wenn Du es nur asynchron (parallel im Hintergrund) machen möchtest, nutze AJAX.nein schön wäre es wenn ich sage "abschicken" und kann dann im selben fenster ganz normal weiter arbeiten
Und das kannst du etwa nicht, wenn du per XHR ein script anstößt?
ajax ist sicherlich ein teil dessen, was ich zum beispiel für eine fortschrittsanzeige verwenden möchte
Ajax for Fortschrittsanzeigen - also du meinst die Kreise die herumrödeln und nicht zeigen, wie lange es noch dauert? :)
ähm ... eine fortschrittsanzeige zeigt den fortschritt an .. lol ... das impliziert meines verständnisses nach die visualisierung, das etwas läuft, und wie weit es ist, sodass man abschätzen kann, wie lange etwas noch dauert, ob das jetzt kreisförmig, in zahlen, als balken oder in törtchen gemacht wird, ist mir relativ egal und kann man ja in verschiedenen styles erstellen ;)
wenn ich mich korrekt belesen habe, ist das linus / unix ...
aber wenn ich mir vorstelle, dass das unter win etwas ähnliches wie die aufgabenplanung ist, dann wäre ja im prinzip das unter umständen auch damit lösbar ...Der Task Scheduler unter Windows ist ein Dreirad (mit zusätzlichen Stützrädern) während der cron-Daemon ein Motorrad mit über 100 kW ist :p
Es ist das mittel der Wahl für diese Art von Aufgaben.
ok, das heißt, um das mal festzuhalten: sofern ich in meinem vorgegebenen system bleibe, kann ich mir nur selbst was zusammenbauen und muss leider auf cron-jobs verzichten
eine sache muss ich mal festhalten: ich denke ein einzelner workerthread ist nicht unbedingt sinnvoll, sondern es müsste eine instanz eines workerthreads erstellt werden, der sich genau einer aufgabe annimmt
Ich halte nochmal folgendes Fest: Wieso nicht ein Cron-Job, der genau das zu den Zeiten tut, was er tun soll?
systemvoraussetzungen
der nächste workerthread sieht nun, dass aufgabe 1 schon in bearbeitung ist, und schnappt sich, sofern vorhanden aufgabe 2, und so weiter
somit geht man auch dem problem aus dem weg: was ist wenn ein workerthread terminiert wird oder abstürzt? ganz einfach: der letzte nachvollziehbare punkt ist ja im journal, also kann nach einer gewissen zeitspanne (jeder workerthread schreibt auch ins journal wann er das letzte mal aktiv war, sagen wir mal alle 5 sekunden) ein neuer workerthread erkennen, dass dort offensichtlich die aufgabe, die zwar von einem thread übernommen wurde, jedoch der thread scheinbar nicht mehr existiert, neu übernommen werdenCron Job?
siehe oben, aber dennoch danke für deine tipps ;)
ajax ist sicherlich ein teil dessen, was ich zum beispiel für eine fortschrittsanzeige verwenden möchte
Ajax for Fortschrittsanzeigen - also du meinst die Kreise die herumrödeln und nicht zeigen, wie lange es noch dauert? :)
ähm ... eine fortschrittsanzeige zeigt den fortschritt an .. lol ... das impliziert meines verständnisses nach die visualisierung, das etwas läuft, und wie weit es ist, sodass man abschätzen kann, wie lange etwas noch dauert, ob das jetzt kreisförmig, in zahlen, als balken oder in törtchen gemacht wird, ist mir relativ egal und kann man ja in verschiedenen styles erstellen ;)
Den Smilie übersehen? ;)
ok, das heißt, um das mal festzuhalten: sofern ich in meinem vorgegebenen system bleibe, kann ich mir nur selbst was zusammenbauen und muss leider auf cron-jobs verzichten
Auch wenn das System vorgegben ist: selbst bei "billighostern" gibts quasi immer irgendwo eine Möglichkeit, einen Cron-Job zu nutzen. Einfach mal Fragen :)
Moin!
im prinzip sollte dieser thread, welcher php-code ausführen sollte, permanent laufen, also nicht erst durch einen seitenaufruf "angeschubst" werden, sodass er halt auch mal nachts aufgaben wie datenbankoptimierungen durchführen kann ...
Gearman - oder eine andere Konstruktion, die eine Job-Queue bereitstellt.
- Sven Rautenberg
Moin!
im prinzip sollte dieser thread, welcher php-code ausführen sollte, permanent laufen, also nicht erst durch einen seitenaufruf "angeschubst" werden, sodass er halt auch mal nachts aufgaben wie datenbankoptimierungen durchführen kann ...
Gearman - oder eine andere Konstruktion, die eine Job-Queue bereitstellt.
- Sven Rautenberg
das sieht ja sehr interessant aus ... ich habe zwar eher nach einem konzept als nach einer "direkten lösung" (ob man es so bezeichnen darf keine ahnung, dafür muss ich jetzt erstmal ein wenig lesen ;) )gesucht, aber hey, das sieht echt vielversprechend aus, dank dir!
jetz ran ans lesen ;)