您可以添加在数据库中的列(或辅助表),并作为最初标记所有地址“要工作”:
我通过执行这个脚本。
那么你的脚本可以:
- 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中做到这一点,但这可能是矫枉过正。此外,您可以使用一些技巧(如果您还没有这样做)来加速操作。一种可能性是将多个地址“合并”为密件抄送:,如果电子邮件正文相同;通过这种方式,您可以在一次通话中发送多条短信注意不要超过任何密件抄送:限制您的ISP可能执行。这个策略在ISP端使用更多的资源,所以请检查它们。
另一种可能性(可一起使用)是发送按域排序的电子邮件。如果可能的话,多个邮件服务器尝试在一个连接中将电子邮件发送到同一台服务器以节省资源和时间。如果您将一组电子邮件全部发送到同一个域中,则可以使服务器更轻松。
在这最后一种情况下,你会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"