PHP - Verhinderung der Kollision in der Cron - lock-Datei sicher?
Ich bin auf der Suche nach einem sicheren Weg, um zu verhindern, dass ein cron-job Kollision (ie. verhindern, dass es ausgeführt wird, wenn eine andere Instanz wird bereits ausgeführt).
Einige Optionen, die ich gefunden habe, empfehlen durch ein lock auf eine Datei.
Ist das wirklich eine sichere option? Was würde passieren, wenn das Skript stirbt zum Beispiel? Wird die Sperre bleiben?
Gibt es andere Möglichkeiten, dies zu tun?
- Wenn Sie die Datei öffnen zum schreiben ist es nicht gesperrt werden, um einen Prozess schon?
- in linux - Nr.
- Ich denke, dass ich wirklich brauchen, um zu überprüfen, dass Dinge Dank.
- Nein, diese Lösung ist nicht gut. Betroffen ist endlos sperren, wenn der Prozess starb und race-Bedingung. Die bessere Lösung wäre die Verwendung
flock
- wenn das script stirbt dann Sperre durch
flock
veröffentlicht werden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Probe war genommen http://php.net/flock und ein wenig geändert und das ist ein richtige Weg, das zu tun, was Sie wollen:
Nicht verwenden Orten wie
/tmp
oder/var/tmp
wie Sie konnten gereinigt werden, jederzeit von Ihrem system, so messing mit Ihrer lock pro die docs:https://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch03s18.html
https://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch05s15.html
Tun verwenden Sie einen Speicherort, den Sie unter Ihrer Kontrolle.
Credits:
w+
stattr+
w+
- Modus fürfopen
im Fall der lock-Datei wäre nicht vorhanden.fopen
imw+
- Modus zu Problemen führen könnte, mitflock
: stackoverflow.com/questions/13039065/...w+
keine Probleme, wenn verwendet mitflock
und verhält sich genau wie erwartet.w+
funktioniert, aber wenn jemand eine Anwendung, wo es Inhalte in der lock-Datei (wie die Uhrzeit der letzten Datei fertig ausgeführt),w+
überschreiben Sie den Inhalt. Dies bedeutet, dass seitfopen
verwendet wird, bevor Sie prüfen, ob die Datei gesperrt ist, wird der Inhalt der lock-Datei wird gelöscht, bevor Sie die Möglichkeit hatte, es zu Lesen. Eine bessere option ist die Verwendungc+
. Ich habe nur kommentiert, weil ich bin irgendwie ein noob und dieses problem hat mich eine Weile, um zu Debuggen.w+
überschrieben würde, den Inhalt. Wenn man kopiert den code ohne zu verstehen, wie es funktioniert - es ist Ihre erste Frage 🙂c+
liefert die gleichen Ergebnisse wiew+
außer dass es nicht schaffen dieses problem. Hoffentlich hat jemand dieses Problem werden Sie meine Kommentare Lesen.In Symfony-Framework können Sie die lock-Komponente symfony/lock
https://symfony.com/doc/current/console/lockable_trait.html
Habe ich erweitert das Konzept von zerkms erstellen Sie eine Funktion, die aufgerufen werden kann, der Beginn einer cron.
Mithilfe der Cronlocker geben Sie ein Schloss-name, dann der name einer callback-Funktion, die aufgerufen werden, wenn der cron DEAKTIVIERT ist. Optional können Sie ein array von Parametern übergeben, die callback-Funktion. Es gibt auch eine optionale callback-Funktion, wenn Sie brauchen, um etwas anders zu machen, wenn die Sperre aktiviert ist.
In einigen Fällen bekam ich ein paar Ausnahmen, und wollte in der Lage sein, um Sie zu fangen, und ich fügte hinzu, eine Funktion für den Umgang mit schwerwiegenden Ausnahmen, die Hinzugefügt werden soll. Ich wollte in der Lage sein, Sie zu schlagen, die Datei von einem browser und umgehen die cronlock, so dass s gebaut.
Fand ich als ich dieses viel gab es Fälle, wo ich wollte zu blockieren, andere crons ausgeführt, während das von cron ausgeführt wird, also habe ich ein optionales array mit lockblocks, die anderen lock Namen zu blockieren.
Dann gab es Fälle, wo ich wollte, dass dieser cron ausgeführt wird, nach der anderen crons beendet hatte, so gibt es ein optionales array von lockwaits, die anderen lock Namen zu warten, bis von denen keine ausgeführt werden.
einfaches Beispiel:
callback-Parameter und Fehler-Funktionen:
blockieren und warten:
Klasse:
Sollte auch implementiert werden auf einer gemeinsamen Seite oder eingebaut in Ihre bestehende fatal error handler: