TatsuSheva Ответов: 1

Как отправить несколько писем одновременно на PHP


Здравствуйте, у меня есть база данных, и в моей базе данных у меня есть около 300 писем внутри, но когда я отправляю, у меня возникает эта ошибка:
504 Gateway Time-out

The server didn't respond in time.


Что же мне делать ?
Вот код:

$result = $pdo->query("SELECT * FROM table WHERE week= ".date('W')." ") $count = 1;
while($row = $result->fetch(PDO::FETCH_ASSOC))
{
	
	if (!filter_var($row['Email'], FILTER_VALIDATE_EMAIL) === false) 

	{
	
$Fr_Email		= $row['Email'];



$title= "xxx - xxx";
$tete.= "From:XXX <xxx@xxx.com>\n";
$tete.= "X-Priority: 1 \n";
$tete.= "MIME-Version: 1.0"."\n";
$tete.= "Content-Transfer-Encoding: 8bit \n";
$tete.= "Content-type: text/html; charset=utf-8"."\n";
$corps= "Body";

   mail($Fr_Email, $title, $corps, $tete);
   
 if ($count % 5 == 0) {sleep(5);} $count++;


  	}

}


Что я уже пробовал:

Есть ли какое-то решение для этого ?

1 Ответов

Рейтинг:
0

Wendelius

Скорее всего, это займет слишком много времени, чтобы отправить все сообщение, поэтому вы столкнетесь с таймаутом. Попробуйте либо увеличить тайм-аут, либо отправлять письма меньшими порциями, например по 50 писем на каждый вызов.

Взгляните на PHP: set_time_limit-руководство пользователя[^]


TatsuSheva

Да, я пытался отправить каждые 50, используя в sql-запросе "LIMIT" первые 50, но когда я делаю это "LIMIT 50,100", ошибка появляется снова...

Wendelius

Насколько я вижу, в SQL-операторе у вас нет критериев, которые помешали бы отправить почту снова, и у вас нет никакой сортировки. Поэтому, когда вы пытаетесь ограничить, вы можете снова получить те же записи, и если таблица содержит много строк, то время может быть потрачено самим запросом.

Сказав это, это звучит как проблема оптимизации запросов. Мало что нужно проверить:
- убедитесь, что у вас есть индекс по столбцу неделя
- убедитесь, что у вас есть правильный первичный ключ
- сортировка по первичному ключу
- в предложении where добавить условие для устранения сообщений, которые уже отправлены
- при необходимости добавьте столбец, содержащий информацию о том, отправлено письмо или нет
- добавьте вновь добавленный столбец в индекс вместе с неделей

TatsuSheva

Правильно ли это делать "предел 50 100"? У меня 300 записей...

Wendelius

Предложение LIMIT будет принимать желаемое количество строк,но вы должны сначала упорядочить их. В противном случае вы можете получить одни и те же строки дважды или более

Кроме того, если у вас есть 300 записей на эту неделю, каково общее количество записей в таблице. Вот что влияет на скорость. Из-за этого я написал предложения в своем предыдущем комментарии.