Ich habe eine Email-Queue-Datenbanktabelle erstellt. Ich werde alle E-Mails einfügen, die meine PHP-Anwendung in diese Tabelle senden muss.
Ein anderes PHP-Skript sucht dann nach allen nicht gesendeten E-Mails und sendet sie.
Ich führe dieses Skript mit Cronjobs aus. Leider können Cronjobs nur maximal einmal pro Minute laufen. Im schlimmsten Fall muss der Benutzer also eine Minute warten, bis seine E-Mail versandt wird.
Meine aktuelle Idee für eine Problemumgehung ist das Aufrufen des Skripts mit einem zusätzlichen Schlafparameter und Duplizieren der Cronjobs.
Beispiel:
%Vor%Im obigen Beispiel würde das Skript alle 10 Sekunden ausgeführt werden. Die erste Zeile des emails.php Skripts wäre:
%Vor%Für den Anfang würde ich empfehlen, die Befehlszeilenversion von PHP zu verwenden, anstatt curl zu verwenden, um ein Skript aufzurufen. Sie können dann ein PHP-Skript mit einer vernünftigen Lebensdauer erstellen, die nicht durch die Ausgabe einer Antwort innerhalb eines bestimmten Zeitraums eingeschränkt ist.
Als solches können Sie dann innerhalb des PHP-Skripts einfach schlafen / nach E-Mails / Sende / Schlaf usw. suchen, anstatt unnötig cron zu verwenden.
Außerdem würde ich darauf achten, dass mehrere PHP-Skripte nicht gleichzeitig in der Datenbanktabelle arbeiten, entweder durch Verwendung einer PID-Datei oder eines Datenbank-Einstellungsansatzes (wenn eine bestimmte Datei / Einstellung existiert / gesetzt ist) Abbruch der Verarbeitung) oder durch sinnvolles Timing des Cron-Jobs und Begrenzung der maximalen Verarbeitungszeit des Scripts durch Überprüfung, wie lange es vor dem Beginn des "check for email" -Bereichs des Zyklus abgelaufen ist.
Hier ist ein einfaches Bash-Skript, das ich geschrieben habe, das mit crontab verwendet werden kann, um häufiger als 1 Minute zu laufen.
Sie können es als ~ / bin / runEvery.sh speichern Schreiben Sie dann in crontab so etwas, um otherScript.sh alle 5 Sekunden auszuführen:
*/1 * * * * ~/bin/runEvery.sh 5 otherScript.sh
Dies ist das Skript:
%Vor%Wenn Sie dies alle 10 Sekunden tun, ist Cron nicht das richtige Werkzeug für den Job. Was Sie brauchen, ist ein Skript, das kontinuierlich läuft, wie von Ish gezeigt.
Sie können das Skript als Dienst registrieren, indem Sie ein entsprechendes Start / Stopp-Skript in /etc/init.d einfügen und es aktivieren.
Wenn Sie nur ein Benutzerkonto haben, können Sie es in einer Bildschirmsitzung ausführen. Dann können Sie sogar den Ausgang zur Fehlerdiagnose beobachten.