Ich versuche, ein PHP-Skript zu schreiben, das sicherstellen will, dass nur eine einzelne Instanz zu einem bestimmten Zeitpunkt ausgeführt wird. All diese Gespräche über verschiedene Arten der Sperrung und die Rennbedingungen usw. usw. geben mir die Willies.
Ich bin verwirrt, ob Lock-Dateien der Weg zu gehen sind, oder Semaphoren, oder MySQL-Sperren verwenden, oder usw. usw. usw.
Kann mir jemand sagen:
a) Was ist der richtige Weg dies zu implementieren?
AND
b) Verweisen Sie mich auf eine PHP-Implementierung (oder etwas, das einfach auf PHP portiert werden kann?)
Sie können sich für die Lösung entscheiden, die am besten zu Ihrem Projekt passt. Die zwei einfachen Möglichkeiten, dies zu erreichen, sind das Sperren von Dateien oder das Sperren von Datenbanken.
Für Implementierungen der Dateisperrung, überprüfen Sie Ссылка
Wenn Sie bereits eine Datenbank verwenden, erstellen Sie eine Tabelle, generieren Sie ein bekanntes Token für dieses Skript, fügen Sie es dort ein und entfernen Sie es nach dem Ende des Skripts. Um Probleme bei Fehlern zu vermeiden, können Sie Ablaufzeiten verwenden.
Wenn Sie PHP unter Linux verwenden und ich denke, der praktischste Weg ist:
%Vor%Eine andere Möglichkeit besteht darin, die Datei zu markieren und den Rückruf zu beenden. Der Exit-Callback stellt sicher, dass das File-Flag auf 0 zurückgesetzt wird, auch wenn die php-Ausführung schwerwiegende Fehler enthält.
%Vor%Eine Möglichkeit besteht darin, die php-Funktion flock mit einer Dummy-Datei zu verwenden, die als Watchdog fungiert.
Wenn am Anfang unseres Jobs die Datei ein LOCK_EX Flag auslöst, können Sie den Vorgang beenden oder warten.
Php Flock Dokumentation: Ссылка
Für diese Beispiele muss zuerst eine Datei namens lock.txt erstellt werden.
Beispiel 1 , wenn ein anderer Zwillingsprozess ausgeführt wird, wird er ordnungsgemäß beendet, ohne erneut zu versuchen, und gibt eine Statusmeldung aus.
Es wird der Fehlerzustand ausgelöst, wenn die Datei lock.txt nicht erreichbar ist.
%Vor%Beispiel 2 möchten wir, dass der Prozess auf eine Ausführung nach der Warteschlange wartet, falls vorhanden:
%Vor%Es ist auch möglich mit fopen in x Modus, indem Sie eine Datei erstellen und löschen, wenn das Skript endet.
Erstellen und öffnen Sie nur zum Schreiben; Platziere den Dateizeiger an der Anfang der Datei. Wenn die Datei bereits existiert, rufen Sie den Aufruf fopen () auf wird fehlschlagen, indem Sie FALSE
zurückgeben