Ich muss ein PHP Skript ausführen, ich möchte sicherstellen, dass nicht mehr als ein Skript zur gleichen Zeit ausgeführt wird.Wie man Einzel-Thread-Job mit MySQL-Datenbank verwalten?
ich mysql verwende, und ich dachte über diese Lösung:
Ich baue die unten Datenbank:
job_id | task_id | last_updated_time (AUTO UPDATE)
"sending_emails" 77238 2107-5-3 12:2:2
Bevor Sie das Skript ausführen ich zufällige Aufgabe ID erstellen, dann betreibe ich eine Abfrage zu aktualisieren die Aufgaben-ID
$task_id = generate_random_task_id();
$query = "
UPDATE
jobs
SET
task_id = $task_id
WHERE
task_id = $task_id
OR
NOW() - last_updated_time > 30
LIMIT 1
"
/*
Then I need to check if there was an update, if yes then I will run the script otherwise i will stop since there is already another script running
*/
$query = "SELECT JOB_ID WHERE taks_id = $task_id "
$result = run($query)
if(! isset($result[JOB_ID])){
DIE();
}
Gibt es eine Chance, dass zwei Skripte gleichzeitig laufen?
Vielen Dank für Ihre Antwort, aber ich bin mir nicht sicher, warum finish_time funktioniert, und meins wird nicht funktionieren? –
Könnten Sie bitte @ Darshan Mehta Antwort sehen! –
Abgesehen von den Komplikationen, die sich bei der Ausführung von Berechnungen in SQL ohne Angabe des Intervalls ergeben, wird Ihr Ziel nur erreicht, wenn Sie * garantieren *, dass die Ausführung weniger als 30 Sekunden dauert. Abhängig von Ihrem Nebenläufigkeitsmodell in der Datenbank ergeben sich auch Race Conditions. Außerdem haben Sie in Ihrem Beispiel eine sehr niedrige Entropie bei der Generierung Ihrer Task-IDs - und wenn Sie diese mit hoher Häufigkeit ausführen, werden Sie irgendwann mit einer Kollision enden. Muss ich weitermachen? – symcbean