ユーザーに自動メールを送信する PHP スクリプトを開発しました。保留中のメールがないか PHP メール キュー テーブルを確認する PHP スクリプトを使用して、cron ジョブを正常に実装しました。スクリプトは正常に動作していますが、cron ジョブの動作がおかしいです。ユーザーにメールを送信しますが、一度に 3 通または 4 通です。メールを 1 回だけ送信したいのですが、どうすればよいでしょうか。
メールが送信されたかどうかを確認する条件を使用します。0 の場合はメールを送信し、値を 1 に更新します。この条件は正常に動作しています。また、相対データベースにはユーザーごとに 1 つのエントリのみが表示されるため、論理的には 1 つのメールのみがユーザーに送信されるはずですが、代わりに cron ジョブによって一度に 3 つまたは 4 つの同じメールがユーザーに送信されます。
cron ジョブを 2 分ごとに設定しました。コマンドは次のとおりです。
2 * * * * wget (Http PATH to SERVER)/Utils/MailQueue.php
答え1
スクリプトの複数のインスタンスが同時に実行される可能性がある場合は、何らかのロックメカニズムを使用してください。スクリプトにwgetを配置し、群れ指示
2 * * * * /usr/bin/flock -n /tmp/myAppLock.lck /path/to/your/wgetscript
MailQueue.phpスクリプトがcronを実行しているマシンと同じマシン上にある場合はwgetは必要ありません。
2 * * * * /usr/bin/flock -n /tmp/myAppLock.lck /usr/bin/php /path/to/Utils/MailQueue.php
ウェブサーバーがなくても動作するため、おそらくより良い解決策になるでしょう。