毎日のニュースレターを受け取ることに同意したユーザーがたくさんいます。ニュースレターの内容は自動生成されているため、電子メールを送信するcronジョブを設定するだけです。
ただし、たとえば10.000人のユーザーがいる場合、そのようなcronジョブはサーバーを強制終了します。この問題を解決するために何ができるでしょうか?
100通のメールを送信した後のsleep(1)で十分ですか?(もちろん、実行時間制限を1日に設定します)
毎日のニュースレターを受け取ることに同意したユーザーがたくさんいます。ニュースレターの内容は自動生成されているため、電子メールを送信するcronジョブを設定するだけです。
ただし、たとえば10.000人のユーザーがいる場合、そのようなcronジョブはサーバーを強制終了します。この問題を解決するために何ができるでしょうか?
100通のメールを送信した後のsleep(1)で十分ですか?(もちろん、実行時間制限を1日に設定します)
http://php.net/manual/en/function.mail.phpをご覧ください
ノート:
mail() 関数は、ループ内の大量の電子メールには適していないことに注意してください。この関数は、電子メールごとに SMTP ソケットを開いたり閉じたりするため、あまり効率的ではありません。
大量の電子メールの送信については、 » PEAR::Mail および » PEAR::Mail_Queue パッケージを参照してください。
したがって、単純に Mail_Queue パッケージを使用してください...これはすべてのメールを受け取り、それらを処理するだけです。
数か月前にプロジェクトの電子メールを送信するためのシステムを作成したので、次のことを行いました。
データベースには、3 つのテーブルがあります。
ユーザー
user_emails (一部のユーザーは複数の電子メールを持っています)
email_campaign (これは、キャンペーンの送信中にデータを一時的に保存し、終了時にすべてを切り捨てるテーブルです)
キャンペーンの送信を開始すると、メールの送信が完了したすべてのユーザーの行を email_campaign テーブルに挿入します。
このようにして、キャンペーンが終了する前にエラーが発生した場合、続行する場所がわかり、誰にメールを送信したか、誰にメールを送信する必要があるかがわかります。
実際には、2 時間で 45,000 通のメールを送信できました。サーバーの過負荷なし。
あなたがやりたかったように、100通の電子メールごとにsleep()を使用します。
また、サーバー負荷が最も低い午前 2 時にキャンペーンを送信します。
1 時間あたりの送信メール数を制限するようにメール サーバーを構成することもできます。
これにより送信が遅くなりますが、サーバーの負荷が軽減されます。