PHP睡眠功能(电子邮件限制)冻结整个服务器

时间:2012-08-23 22:49:34

标签: php email sleep

我使用的是标准的共享Hostgator,每小时限制为500封邮件。

我试图限制我的电子邮件脚本,每8秒只发送一封电子邮件......

$query=mysql_query("SELECT email FROM users WHERE verified='1' ORDER BY balance DESC");
while($arr=mysql_fetch_array($query)){
set_time_limit(30);
$mail->AddAddress($arr[0]);
$mail->Send();
$mail->ClearAddresses();
echo "Sent to ".$arr[0]."<br><br>";
sleep(8);
}

我正在使用PHPMailer。脚本本身工作正常,每8秒发送一次电子邮件......

但域名的其余部分完全冻结了。

是否有另一种睡眠方法我可以使用它不会冻结我的整个域名?

谢谢:)

4 个答案:

答案 0 :(得分:1)

我建议使用cron作业(Unix)或计划任务(Windows)在设定的持续时间内调用此脚本。

或使用类似Mandrill的内容来处理批量电子邮件的发送。

答案 1 :(得分:1)

Cronjobs不能仅在第二时间执行。分钟字段中的*/1将每隔1分钟运行一次脚本,但您无法获得更细微的内容。

睡眠没有问题,但不要从浏览器运行命令。您锁定域的原因是因为您的Apache线程在睡眠时被保留在脚本上。在完成之前,您的请求将被阻止并排队。

我建议您保留脚本,然后每小时或每隔几个小时用cronjob执行一次。它经常需要运行多久一次?一天一次?

以下将在午夜之后每晚5点运行,并将其扔到后台。

5 0 * * * user php -f /path/to/file &

答案 2 :(得分:0)

这不能直接在脚本中实现,除非它在每次请求后不断运行并重新读取数据库。

我建议每8秒运行一次cron作业,然后从数据库中读取第一个条目,如果存在,请发送电子邮件:

  1. 设置cron作业以每8秒调用一次脚本
  2. 脚本查询数据库以获取表格中的第一个条目
  3. 如果数据存在,请根据该数据发送电子邮件
  4. 删除行
  5. 脚本结束

答案 3 :(得分:0)

您使用while循环锁定服务器。每8秒执行一次循环,然后再等待8秒。其他一切都要等到它完成。尝试使用cron作业。