php скрипт замедляется при отправке электронной почты

#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);
 

это помогает запустить скрипт, который должен выполняться в течение неизвестного времени.