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


PHP Sleep Function (Email Throttling) Freezes Entire Server

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

我正在尝试将我的电子邮件脚本限制为每8秒只发送1封电子邮件。。。

$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秒发送一次电子邮件。。。

但该领域的其余部分完全冻结。

有没有一种我可以使用的替代睡眠方法不会冻结我的整个领域?

感谢:)

Cronjobs不能第二次执行,只能执行一分钟。分钟字段中的*/1将每1分钟运行一次脚本,但您无法获得比这更精细的内容。

睡眠没有什么问题,但不要从浏览器运行命令。锁定域的原因是Apache线程在脚本上处于休眠状态。在它完成之前,您的请求将被阻止并排队。

我建议您保留您的脚本,并使用cronjob每小时或每隔几个小时执行一次。它真正需要多久运行一次?一天一次?

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

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

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

或者使用类似Mandrill的东西来处理批量电子邮件的发送。

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

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

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

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