#php #html-email
#php #html-электронная почта
Вопрос:
Я запускаю этот скрипт, он подходит для одного контекста, но когда я пробую это на 4 получателях, он не работает, просто показывая эту ошибку:
Fatal error: Maximum execution time of 30 seconds exceeded in D:Hosting8011955htmladminnewsletter.php on line 60
Как я могу улучшить этот код? Я просто хочу отправить электронное письмо не более 200.
вот код:
if(!(is_array($errors)))
{
$headers = "MIME-Version: 1.0" . "rn";
$headers .= "Content-type:text/html;charset=iso-8859-1" . "rn";
$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);
}
}
Комментарии:
1. И что говорят журналы, ммм?
2.
mail()
это медленная функция. вы не сможете ускорить его, не сбросив его и не переключившись на что-то лучшее, например, PHPMailer или Swiftmailer
Ответ №1:
Сколько совпадающих строк в newsletter
таблице?
Кроме того, в вашем коде есть логическая ошибка — он будет добавлять новое To:
поле каждый раз в цикле, поэтому первое письмо будет отправлено на:
To: user1@example.com
А второй отправится в:
To: user1@example.com
To: user2@example.com
Это приведет к user1@example.com
получению одного сообщения для каждого пользователя в вашем списке рассылки, user2@example.com
получению на одно сообщение меньше и так далее. Не делайте этого. 🙂
Комментарии:
1. БУДЬТЕ ОСТОРОЖНЫ! Если вы не удаляете «кому» во время каждой итерации, вы можете в конечном итоге отправить электронное письмо нецелевым получателям. В старой библиотеке FMail была известная проблема с этим.
2. ооо, спасибо … я понял вас … вы подскажете, как я могу улучшить код. чтобы я мог отправить электронное письмо 100 контактам…
Ответ №2:
По умолчанию PHP-скрипты выполняются в течение 30 секунд, а затем останавливаются. Это значение контролируется max_execution_time
значением в php.ini. Вы можете переопределить это значение в текущем скрипте, вызвав 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);
}
Ответ №3:
поместите нижнюю строку в начале вашей функции.
set_time_limit(0);
это помогает запустить скрипт, который должен выполняться в течение неизвестного времени.