php рассылка писем

12
KK
На сайте с 25.07.2006
Offline
138
1835

Пишу скрипт рассылки писем для сайта. В письме html код с прикрепленными картинками новых товаров. подписчиков в данный момент около 2000 - время выполнения скрипта будет явно больше 30 сек. set_time_limit(0) на сервере не работает. + нужно сделать задержку между отправкой, чтобы поменьше сервер грузить.

Подскажите как правильнее организовать фоновое выполнение скрипта?

Вот нашел такой пример:

<?php


$start_time = microtime(); // Узнаем время запуска скрипта
$start_array = explode(' ',$start_time); // Разделяем секунды и миллисекунды
$start_time = $start_array[1] + $start_array[0]; // Сумируем секунды и миллисекунды получаем стартовое время скрипта

ignore_user_abort(1); // Игнорировать обрыв связи с браузером

$max_exec = ini_get( 'max_execution_time' ); // Получаем максимальное время работы скрипта

do{

// Что хотим, то воротим..

$now_time = microtime(); // Узнаем текущее время
$now_array = explode(' ',$now_time);
$now_time = $now_array[1] + $now_array[0];
$exec_time = $now_time - $start_time; // Вычитаем из текущего времени начальное начальное

if (file_exists( 'stop.txt' ))
break; // Остановка скрипта, работающего в фоновом режиме

} while($exec_time > ($max_exec - 5)); // Проверяем время работы, если до конца работы скрипта
// осталось менее 5 секунд, завершаем работу цикла.

$http = fsockopen('site.ru', 80); // Запускаем этот же скрипт новым процессом и завершаем работу текущего

fputs($http, "GET http://site.ru/script.php HTTP/1.0\r\n");
fputs($http, "Host: site.ru\r\n");
fputs($http, "\r\n");
fclose($http);

?>

Но в данном случае я так понимаю скрипт будет выполняться заново, т.е. снова отсылать письма сначала, а не тем, кому еще не отослал.

Т.е. необходимо указать с какого места начинать отсылку. Как это лучше сделать? Сделать в таблице базы данных дополнительный столбик и в нем менять значение после отправки?

ДП
На сайте с 23.11.2009
Offline
203
#1

Да, с БД и списком отправки самое простое решение на мой взгляд.

Отправляйте письма по 10, например, за заход и запускайте скрипт по крону раз в минуту - у вас письма за 200 минут и уйдут.

RM
На сайте с 21.06.2011
Offline
77
#2

Я бы создал временную таблицу...

KK
На сайте с 25.07.2006
Offline
138
#3

Так а зачем по крону запускать, если в этом примере скрипт сам перезапускается?

ДП
На сайте с 23.11.2009
Offline
203
#4

Идеологически более правильно :) Если не хотите по крону - используйте ваш вариант, только если он где-нибудь на полпути остановится - установить причину будет сложнее.

kdv12
На сайте с 05.12.2011
Offline
52
#5

Ничего сложного. Раз не можешь обработать все за одно выполнение скрипта, то раздели на части. А для того чтобы определить конец работы пред. запуска скрипта, используй доп. св-во в БД. Отправил письмо, пометил данный e-mail. Отправил все письма, очистил везде данное поле.

Разработка сайтов любой сложности на 1С-Битрикс. Бесплатные консультации.
KK
На сайте с 25.07.2006
Offline
138
#6

kdv12, спасиб, я это и имел ввиду в первом сообщении под

Сделать в таблице базы данных дополнительный столбик и в нем менять значение после отправки?

Так и сделаю. Если будут проблемы - попробую по крону реализовать.

palladin_jedi
На сайте с 13.07.2010
Offline
71
#7
RoMaN444Ik:
Я бы создал временную таблицу...

Это было бы правильнее всего. И потом через cron работать скриптом с ней.

Я когда-то от нехрен делать написал скрипт рассылки почты через XMLHttpRequest. То еще извращение было. :)

Сайт о web-разработке и прочем (http://seazo.net)||Продвижение статьями под Google (http://short.seazo.net/ght4zf) Бесплатные консультации рефералам Sape (http://www.sape.ru/r.SWfwWOblBo.php) PHP и JS скрипты на заказ, создание сайтов с нуля и на CMS.
[umka]
На сайте с 25.05.2008
Offline
456
#8
Kel_Kimpbell:
Так а зачем по крону запускать, если в этом примере скрипт сам перезапускается?

В данном случае скрипт не перезапускается, а рекурсивно вызывает сам себя, т.е. работает цепочка процессов. Сделает он 100 вызовов самого себя, будет занято 100 слотов веб-сервера, будет висеть 100 процессов, а работать будет только последний.

Лог в помощь!
DV
На сайте с 01.05.2010
Offline
644
#9

Если веб не важен, пускайте прямо из шела, что-то вроде php скрипт.php

За одно и нагрузка меньше будет.

VDS хостинг ( http://clck.ru/0u97l ) Нет нерешаемых задач ( https://searchengines.guru/ru/forum/806725 ) | Перенос сайтов на Drupal 7 с любых CMS. ( https://searchengines.guru/ru/forum/531842/page6#comment_10504844 )
LinnTroll
На сайте с 12.01.2011
Offline
15
#10

fputs($http, "GET http://site.ru/script.php HTTP/1.0\r\n");

*FACEPALM* как вам в голову то только пришло?! cron, срочно!

http://vps.ua/ (https://vps.ua/clients/aff.php?aff=201) - самый лучший хостинг.
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий