メーリング リスト アプリケーションを作成しています。メールサービスの制限により、1時間に40通のメールを送信します。タイマーを追加するにはどうすればよいですか?
4 に答える
スケジュールされたタスクを作成する必要がある場合は、Cron Jobを作成することをお勧めします。
関数を使用してスクリプトを一時停止できsleep()
ます。しかし、それは良い解決策ではありません。はるかに優れたアプローチは、40 分ごとに 1 回スクリプトを実行できるCronを使用することです。スクリプト自体は、これまでに実行された回数のみを確認する必要があります。その情報は、いくつかのファイルに保存できます。
$counter = file_exists('counter') ? file_get_contents('counter') : 1;
echo sprintf('Send %d portion of emails.', $counter);
file_put_contents('counter', ++$counter);
私はこれを見つけました: http://swiftmailer.org/docs/throttler-plugin
1 つの解決策は、送信した電子メールの詳細を保持するデータベース テーブルを作成することです。次のように見えるとしましょう。
CREATE TABLE SentEmail (
email_id INT NOT NULL,
recipient_id INT NOT NULL,
time_sent DATETIME NOT NULL,
PRIMARY KEY (email_id, recipient)
)
email_id
これは、送信用にマークした電子メールを含むテーブルへの外部キーであるrecipient_id
必要があり、受信者の詳細を含むテーブルへの外部キーである必要があります。time_sent
電子メールが送信された時間を明らかに記録します。
今、あなたがメールを送信したいとき、あなたは知りたいと思うでしょう
- この時間に送信された電子メールの数。
COUNT
これはクエリを使用して見つけることができます - あなたが現在扱っている電子メールをすでに送信した人; これも単純なクエリです。
これに関する考えられるバリエーションは、これまでに送信されたすべての電子メールに対して 1 つだけではなく、送信しようとしている電子メールとユーザーの組み合わせごとにテーブルに行を持ち、その電子メールがそのユーザーにまだ送信されているかどうかを示す列を持つことです。 . これにより、まだメールを送信しなければならない相手も簡単にわかります。
他の人が提案しているように、このアプローチを Cron ジョブと組み合わせて、メールのキューが定期的に処理されるようにします。