Prüfen, ob bereits eine Instanz des Prozesses arbeitet

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Prüfen, ob bereits eine Instanz des Prozesses arbeitet

    Hallo PHP-Gemeinde,

    was ist denn eine einfache und zuverlässige Möglichkeit, um festzustellen, ob bereits eine Instanz eines Skripts bzw. Prozesses läuft?

    Meine Update-Funktion besteht aus einer größeren Anzahl von Skripten, die der Reihe nach ausgeführt werden und dabei auch in Files und Datenbank schreiben, was natürlich kritisch werden kann, wenn mehrere Instanzen dieses Prozesses gleichzeitig gestartet werden.

    Es soll also auf jeden Fall gesichert sein, dass immer nur höchstens eine Instanz des Prozesses gleichzeitig läuft.

    Ich möchte jetzt aber nicht nachträglich wie auch immer gestrickte Semaphoren-Blöcke in die Skripte einbauen und danach fünf weitere Tage alles durchtesten, sondern nach Möglichkeit auf einen Skript-externen, d.h. serverspezifischen Indikator, z.B. eben Server-Variablen zurückgreifen.

    Und was natürlich auch nicht viel bringt, ist das Setzen eines Flags in der Datenbank, wenn die erste Instanz gestartet wird (die zweite würde das Flag ja bereits erkennen und abbrechen), denn wenn der Prozess mal unerwartet abbricht, bleibt das Flag ja gesetzt - auch hier wäre ein Umbau sämtlicher betroffener Skripte dahingehend erforderlich, dass das Flag bei jedem Abbruch wieder gelöscht wird - ein furchtbarer Aufwand, braucht man gar nicht weiter drüber nachdenken.

    Kann ich denn über irgendwelche Server-Variablen rauskriegen, wie oft ein Skript läuft bzw. ob zu einem best. Zeitpunkt bereits andere PHP-Skripte auf dem lokalen Server ausgeführt werden? (wär zwar eine qualitative Einschränkung gegenüber der Abfrage, ob es sich dann auch um eine Instanz desselben Prozesses handelt, aber immer noch besser, als jetzt alle Skripte zu überarbeiten ).
    Gibts z.B. eine Liste aller aktuell auf dem Server laufenden Skripte, die man über PHP auslesen kann?

    Hat jemand einen Tip, wie man rausbekommt, ob der Prozess bereits läuft?

    Gruß Michi

  • #2
    du könntest z.b. mit exec() oder system() tools auf dem server aufrufen und die rückgaben auswerten.

    aber ich persönlich mache das lieber mit einem lock-file oder auch ein db-eintrag incl timestamp.

    das script legt zu beginn eine datei an oder halt den eintrag in der db. ein neuaufruf prüft, ob das flag (datei oder db) gesetzt ist. ist dem so, bricht das script ab. ist ein script durchgelaufen, wird das flag wieder entfernt.

    nun kann es bei abbruch des scriptes dazu kommen, dass das flag weiterhin besteht. also nachfolgende aufrufe immer abbrechen werden. das hast du schon gut erkannt.

    nun kommt aber der timestamp in der db (bzw die erstellzeit der datei) zum zuge. hier kannst du nun prüfen, ob die datei oder der db eintrag älter als X minuten ist. ist er älter wird das script trotz flag ausgeführt, wobei das alte flag gelöscht und neu angelegt werden muss. (wegen der zeit des flags)

    X musst du hierbei so wählen, dass sich die scripte niemals überschneiden können.
    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


    Kommentar


    • #3
      Re: Prüfen, ob bereits eine Instanz des Prozesses arbeitet

      Original geschrieben von Gruselgockel
      Meine Update-Funktion besteht aus einer größeren Anzahl von Skripten, die der Reihe nach ausgeführt werden und dabei auch in Files und Datenbank schreiben, was natürlich kritisch werden kann, wenn mehrere Instanzen dieses Prozesses gleichzeitig gestartet werden.
      Dein DBMS achtet schon darauf ... falls es nicht irgendein exotisches ist und Datein kannst du mit PHP flock()-en. Ist also gar nicht so dramatisch, wie du glaubst.
      Versuch erstmal ohne selbstgestrickte Absicherung eine Kollision zu verursachen ... bzw. theoretisch zu 'erdenken'.

      Kommentar


      • #4
        Hallo,

        hm, also die Lock-Methode für Files (wobei ich das ja auch nachträglich einbauen müsste?) kenn ich zwar noch, aber wie schauts mit Datenbanken aus? Können sich da Skripte nicht in die Quere kommen? Es ist ja nicht nur ein einziges Skript, das da als Bestandteil des Prozesses läuft und die Datenbank beschreibt. Können nicht mehrere Skripte gleichzeitig laufen, die - und das wiederum muss ja nicht gleichzeitig der Fall sein - in dieselbe Datenbank schreiben?

        Naja, ich kenn mich mit mit der Thread- und Zugriffsrechtverwaltung in PHP zu wenig aus... aber da bin ich eher skeptisch.

        So oder so lieber wäre mir eine Single-Thread-Garantie. Beim Start soll einfach festgestellt werden, ob schon ein Prozess läuft und wenn ja, wird mit Hinweis abgebrochen.

        Ok, die Idee mit dem Timestamp stellt schon einen angenehmen Kompromiss dar, obwohl der Anwender der Funktion ein etwas ungeduldiger Zeitgenosse ist, aber da muss er sich halt mal zusammenreißen und überhaupt braucht er ja auch nicht unbedingt versuchen, das Update in fünf Fenstern gleichzeitig laufen zu lassen.

        Wie genau lässt sich denn das exec() oder system() in diesem Zusammenhang förderlich einsetzen? Hast Du ein simples Beispiel?

        Gruß Michi

        Kommentar


        • #5
          Original geschrieben von Gruselgockel
          Wie genau lässt sich denn das exec() oder system() in diesem Zusammenhang förderlich einsetzen? Hast Du ein simples Beispiel?
          Ach so, indem man einfach die externen Tools checken lässt, ob diese schon mal laufen?

          Kommentar


          • #6
            Original geschrieben von Gruselgockel
            ... aber wie schauts mit Datenbanken aus? Können sich da Skripte nicht in die Quere kommen?
            http://en.wikipedia.org/wiki/ACID

            Kommentar

            Lädt...
            X