Массовая почтовая рассылка.

Camillo

Новичок
Массовая почтовая рассылка.

Всем привет.

Столкнулся со спамерской задачкой - нужно организовать новостную рассылку где-то по 20-30К почтовым ящикам.
Для отсылки писем использую Zend'овский Mail класс.

Если делать влоб, т.е. слать всем по-очереди, то получается ну ооочень медленно.

Хочу попробовать использовать PHP threads, т.е. равными кусками параллельно в несколько потоков слать.

Подскажите пожалуйста, я на верном пути?
По какому пути лучше всего решать эту задачку? (Кроме решения вида "Слать письма плохо!" :) )
Возможно у кого-то есть ссылки интересные почитать?
Или даже может быть есть платные сервисы (не спамерские), которые по своей базе организовывают рассылку грамотно?

Спасибо.

-~{}~ 26.03.09 13:06:

Нашел phplist.com - сейчас поковыряюсь, посмотрю как у них сделано. Может быть даже их и буду использовать.
 

Camillo

Новичок
:)

А чо все так на этот tinyurl.com подсели, а?

Я вот тут думал как у tinyurl.com всё устроено. И стало интересно - у них все сделано через БД или делают структуру папок типа cl/jy/x4/, туда помещают файл с урлом ну и т .д.?
Эх, скорее всего и то и другое. БД просто для удобства, а структура каталогов для скорости.

Всем peace!
 

dimagolov

Новичок
Camillo, узнай что позволяет хотя-бы mod_rewrite и глупых идей про скорость у тебя больше не появится.
 

Camillo

Новичок
Почему глупых то? По-моему я всё верно сказал.
То, что они рерайтят - это понятно - у них сервис на этом основан. :)

-~{}~ 27.03.09 00:51:

А всё, понял, что ты имел ввиду. Ты хочешь сказать, что у них прописано такое кол-во урлов прямо в конфигах? Слабо верится... такие "реестро-конфиги" будут весить ого-го, а толку от них ноль.
 

dimagolov

Новичок
Camillo, у них ВСЕ такие урлы идут на один диспечер, который по ним ищет в базе ссылку, на которую отдается редирект. и делается это одной строкой в конфиге.
 

Camillo

Новичок
Это ясно. Меня больше волнует вопрос - они с базой работают или просто с файловой системой? Т.к. у них ключ типа varchar, то искать по-нему очень трудозатратно - поэтому я думаю, что за всем этим стоит просто структура каталогов.

Если очень упрощенно, то...

Есть файл index.php, которому рерайт из урла "передаёт" параметр из урла, потом этот параметр режется по 2 кусочка
aa/bb/cc, а потом из этой папки икнлудится файл с урлом, типа...

<?

$folders = str_split($_GET['trulala'], 2);
$filename = $folder[0]."/".$folder[1]."/".$folder[2]."/url.php";

if (is_file($filename)) {
include($filename);
header("Location: ".$url);
} else {
die("Нема такого урла!");
}

?>
 

zerkms

TDD infected
Команда форума
Это ясно. Меня больше волнует вопрос - они с базой работают или просто с файловой системой? Т.к. у них ключ типа varchar, то искать по-нему очень трудозатратно
да, поиск по 6 символам это просто нереальная задача для современных серверов.

ps: ключи не бывают "типа varchar". варчаром бывает поле, а у индекса так и так длина фиксированная.
 

tf

крылья рулят
Автор оригинала: Camillo
<?

$folders = str_split($_GET['trulala'], 2);
$filename = $folder[0]."/".$folder[1]."/".$folder[2]."/url.php";

if (is_file($filename)) {
include($filename);
header("Location: ".$url);
} else {
die("Нема такого урла!");
}

?>
да сделай ты такую систему и подумай о чудесах производительности
 

Camillo

Новичок
Да, поиск по 6 символам (а в идеале их должно быть больше) достаточно трудоёмкая задача даже для современных серверов при условии, что кол-во таких записей в БД исчисляется сотнями миллионов и кол-во запросов на поиск таких записей исчисляется сотнями\сек. Именно поэтому я сильно сомневаюсь, что они используют БД для поиска соответствий.

> ps > Ну мы всё равно друг друга поняли. :)
 

dimagolov

Новичок
Camillo, скажи, а что, поиск в ФС происходит не по строкам? и ФС без проблем делают поиск среди сотен миллионов файлов со частотой сотни\сек?

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

Camillo

Новичок
tf, прочитал твою мессагу, потом прочитал сигнатуру - забавно. :)

А что же тут думать о чудесах производительности в этом маленьком кусочке кода? Я вот лично ничего криминального в нем не вижу...

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

$url = "";
@include($filename); //Получаем $url из $filename
if (!empty($url)) {
header("Location: ".$url);
} else {
die("Нема!");
}

Возможно стоит как-то заменить include (возможно, просто считать из файла строку с урлом через fopen). Но на самом деле - думать про оптимизацию ТАКОГО ПРОСТОГО КОДА ПРИ СОВРЕМЕННЫХ СЕРВЕРАХ точно не стоит.

-~{}~ 27.03.09 02:04:

Да я прекрасно понимаю, что Mysql это те же самые файлы, только вид сбоку и в красивой обертке, но согласись, что мускулю еще нужно скомпилировать SQL запрос и т.д. и т.п.
А это тоже занимает процессорное время.
 

zerkms

TDD infected
Команда форума
Да, поиск по 6 символам (а в идеале их должно быть больше) достаточно трудоёмкая задача даже для современных серверов при условии, что кол-во таких записей в БД исчисляется сотнями миллионов и кол-во запросов на поиск таких записей исчисляется сотнями\сек. Именно поэтому я сильно сомневаюсь, что они используют БД для поиска соответствий.
предлагаю попробовать нагенерить сотню миллионов записей, попробовать поискать и убедиться, что всё не так плохо, как ты заблуждаешься.
 

Camillo

Новичок
PS: Я спокоен, просто мне интересно и всё. Я даже не спорю - просто внимательно слушаю и говорю то, что думаю.

-~{}~ 27.03.09 02:10:

Автор оригинала: zerkms
предлагаю попробовать нагенерить сотню миллионов записей, попробовать поискать и убедиться, что всё не так плохо, как ты заблуждаешься.
Лениво заморачиваться, слишком долго будет выполняться INSERT, даже если сделать через один запрос, увеличив максимальный размер запроса в мускуле.

Пусть все остаются при своих мнениях. Всем peace, без обид! :D
 

zerkms

TDD infected
Команда форума
Лениво заморачиваться, слишком долго будет выполняться INSERT, даже если сделать через один запрос, увеличив максимальный размер запроса в мускуле.
генерация ~50M записей на duron 800 с генерацией в пхп у меня проходила в своё время минут за 20...
 

pilot911

Новичок
фишка в том, что любая строка может быть преобразована в число, например, 11 знаков


PHP:
	function md5int($str, $len=7)	{
		return hexdec(substr(md5($str),0,$len));
	}

искать по числу попроще для сервера
 

Alexandre

PHPПенсионер
в добавление к сказанному

что касается архитектуры tinyurl.com, то думаю там все сделано гораздо проще - написан модуль на уровне WEB сервера
все урлы хранятся в БД типа bdb или memcachedb ( любая hash DB)
быстро и эффективно

-~{}~ 27.03.09 10:26:

нет - я не совсем прав - написан собственный сервер.
ну да - буржуи почти не знают про детище Игоря Сысоева
Код:
GET /cljux4 HTTP/1.1
Host: tinyurl.com

HTTP/1.x 301 Moved Permanently
Location: [url]http://ru.wikipedia.org/wiki/–Ъ—Г—И–љ–Є—А,_–Т–&#8734;—А–і–&#8734;–љ_–Т–&#8734;—А–і–&#8734;–љ–Њ–&#8804;–Є—З#.D0.A3.D0.B1.D0.B8.D0.B9.D1.81.D1.82.D0.B2.D0.BE[/url]
Content-Type: text/html
Content-Length: 0
Date: Fri, 27 Mar 2009 07:25:03 GMT
[b]Server: TinyURL/1.6[/b]
 

zerkms

TDD infected
Команда форума
Alexandre
1. для таких примитивных выборок даже неоттюненный mysql с myisam пойдёт.
2. в хедерах можно отдать всё что угодно, хоть winrar 3.5.
 
Сверху