2011-11-01 2 views
1

Я бегу этот сценарий он прекрасно подходит для одного контекста, но когда я пытаюсь это на 4-реципиентов он не работает только с указанием этой ошибки:PHP скрипт медленно при отправке по электронной почте

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); 
    } 
} 
+1

Что такое 'Line 60'? – Neal

+0

А что говорят журналы, ммм? –

+2

'mail()' является медленной функцией. вы не сможете ускорить его, не демпируя его и переключившись на что-то лучше, например [PHPMailer] (http://phpmailer.worxware.com) или [Swiftmailer] (http://swiftmailer.org) –

ответ

1

По умолчанию 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); 
} 
2

Сколько соответствия строк в таблице newsletter?

Как в стороне, есть логическая ошибка в коде - это добавит новую To: поля каждый раз через петлю, так что первая почта будет идти в:

To: [email protected] 

И второй один будет перейдите по ссылке:

To: [email protected] 
To: [email protected] 

Это приведет к [email protected]e.com получению одного сообщения для каждого человека в списке рассылки, [email protected] получать один меньше сообщений, и так далее. Не делай этого. :)

+1

БУДЬТЕ ОСТОРОЖНЫ ! Если вы не очистите «до» на каждой итерации, вы можете в конечном итоге отправить электронное письмо нежелательным получателям. В старой библиотеке FMail была известная проблема. –

+1

ohhh спасибо ... я получил вас ... вы предложите, как я могу улучшить код. так что я могу отправить электронное письмо на 100 контактов ... – xofth

1

положить ниже строки в начале вашей функции.

set_time_limit(0); 

Это помогает запустить скрипт, который необходимо выполнить в течение неизвестного времени.

Смежные вопросы