Ich habe ein PHP-Skript entwickelt, mit dem ich automatisiert E-Mails an Benutzer senden möchte. Ich habe erfolgreich einen Cron-Job mit einem PHP-Skript implementiert, das eine PHP-Mail-Warteschlangentabelle auf ausstehende E-Mails überprüft. Das Skript funktioniert einwandfrei, aber der Cron-Job funktioniert seltsam: Er sendet die E-Mail an Benutzer, aber jeweils 3 oder 4 gleichzeitig. Ich wollte die E-Mail nur einmal senden. Wie kann ich das erreichen?
Ich verwende eine Bedingung, um zu prüfen, ob die E-Mail gesendet wurde oder nicht. Wenn der Wert 0 ist, wird die E-Mail gesendet und der Wert auf 1 aktualisiert. Diese Bedingung funktioniert einwandfrei. Außerdem zeigt die entsprechende Datenbank nur einen Eintrag pro Benutzer an, sodass logischerweise nur eine E-Mail an den Benutzer gesendet werden sollte. Stattdessen sendet der Cron-Job jedoch 3 oder 4 gleiche E-Mails gleichzeitig an den Benutzer.
Den Cronjob habe ich auf alle 2 min gesetzt. Der Befehl lautet:
2 * * * * wget (Http PATH to SERVER)/Utils/MailQueue.php
Antwort1
Wenn Sie denken, dass mehrere Instanzen Ihres Skripts gleichzeitig laufen, verwenden Sie eine Art Sperrmechanismus. Setzen Sie Ihr wget in ein Skript ein und packen Sie es in einHerdeBefehl
2 * * * * /usr/bin/flock -n /tmp/myAppLock.lck /path/to/your/wgetscript
Wenn sich das MailQueue.php-Skript auf derselben Maschine befindet, auf der Sie Cron ausführen, benötigen Sie wget nicht.
2 * * * * /usr/bin/flock -n /tmp/myAppLock.lck /usr/bin/php /path/to/Utils/MailQueue.php
ist wahrscheinlich die bessere Lösung, da es ohne Ihren Webserver funktioniert.