我正在运行这个脚本,它适用于一个上下文,但是当我在4个收件人上尝试这个时,它只是显示此错误:
Fatal error: Maximum execution time of 30 seconds exceeded in D:\Hosting\8011955\html\admin\newsletter.php on line 60
如何改进此代码?我只想发送不超过200封的电子邮件。
这是代码:
if(!(is_array($errors)))
{
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type:text/html;charset=iso-8859-1" . "\r\n";
$headers .= "From: \"".$from_name."\" <".$from_email.">\n";
$query="SELECT email From newsletter WHERE visible='1'";
$result=mysql_query($query) or mysql_error();
while($rowdata=mysql_fetch_array($result))
{
$headers .= "To: \"".$to_name."\" <".$rowdata['email'].">\n";
mail($rowdata['email'], "$sub",$message, $headers);
}
}
答案 0 :(得分:2)
newsletter
表中有多少匹配的行?
顺便说一下,代码中存在逻辑错误 - 每次循环都会添加一个新的To:
字段,因此第一封邮件将转到:
To: user1@example.com
第二个将转到:
To: user1@example.com
To: user2@example.com
这将导致user1@example.com
收到邮件列表中每个人的一条消息,user2@example.com
收到少一条消息,依此类推。不要这样做。 :)
答案 1 :(得分:1)
在函数开头放下一行。
set_time_limit(0);
这有助于运行需要在未知时间执行的脚本。
答案 2 :(得分:1)
默认情况下,PHP脚本运行30秒然后停止。此值由php.ini中的max_execution_time
值控制。您可以通过调用set_time_limit()
函数在当前脚本中覆盖此值。每次调用set_time_limit()
时,脚本执行计时器都会从零开始。因此,您可以将其放在while {}
循环中,以便为您的脚本提供所需的时间。
while($rowdata=mysql_fetch_array($result))
{
set_time_limit(30); // Reset script timer and give script 30 seconds to send the next email
$headers .= "To: \"".$to_name."\" <".$rowdata['email'].">\n";
mail($rowdata['email'], "$sub",$message, $headers);
}