データベースに列(または補助テーブル)を追加し、すべてのアドレスを最初に「作業対象」としてマークすることができます。
次に、スクリプトは次のようになります。
- SELECT the number of worked addresses and total addresses
- display a progress bar
- SELECT the lowest 100, or 50, or N addresses yet to be worked
- send the emails and mark them worked
- issue a javascript to refresh itself.
次に、クライアントには、進行状況バーが継続的に進み、タイムアウトになることのないページが表示されます(「N」が十分に小さい場合)。
AJAXでこれを行うこともできますが、それはやり過ぎかもしれません。
さらに、いくつかのトリックを使用して(まだ実行していない場合)、操作を高速化できます。1つの可能性は、複数のアドレスをBccとして「合体」させることです。電子メールの本文が同一の場合。そうすれば、1回の呼び出しで複数のメッセージを配信できます。Bccを超えないように注意してください。ISPが実施する可能性のある制限。この戦略はISP側でより多くのリソースを使用するため、それらに確認してください。
別の可能性(一緒に使用できます)は、ドメインでソートされた電子メールを送信することです。複数のメールサーバーは、可能であれば、リソースと時間を節約するために、1つの接続で同じサーバーに電子メールを送信しようとします。電子メールのグループをすべて同じドメインに送信すると、サーバーの処理が簡単になります。
この最後のケースでは、次のSELECT
ようなメールを送信します。
SELECT * FROM addresses
WHERE (worked=0 AND active = 1)
ORDER BY SUBSTRING_INDEX(email, '@', -1)
LIMIT 20;
次に(mysql関数の例-PDOの方が優れています)、
while($tuple = mysql_fetch_assoc($exec))
{
if (send_mail_to(...))
$sent[] = $tuple['id'];
else $failed[] = $tuple['id'];
}
// Now mark both SENT and FAILED as worked
$sentm = implode(',', $sent);
$failm = implode(',', $failed);
// UPDATE addresses SET worked = 1 WHERE id IN ($sentm,$failm);
// UPDATE addresses SET active = 0 WHERE id IN ($failm);
PHPセッションで開始時間を節約した場合は、次のようなダッシュボード付きの素敵なバーを表示することもできます。
+--------------------+
|######## |
+--------------------+
40% processed
38% delivered
2% failed
Expected time remaining 5 min 17"