SorgenKind Mech: / Server / PHP: etwas wie ein "Workerthread"

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

  1. 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

    1. 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 ;)

      1. 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?

        1. 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 werden

          Cron Job?

          siehe oben, aber dennoch danke für deine tipps ;)

          1. 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 :)

  2. 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

    1. 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 ;)