методы массовой обработки данных - PullRequest
0 голосов
/ 04 октября 2011

Я ищу способ сделать следующее, и мне нужны ваши советы.У меня есть огромная (действительно) таблица с идентификаторами регистрации, и мне нужно отправлять сообщения владельцам этих идентификаторов.Я не могу отправить сообщение нескольким получателям одновременно, это необходимо выполнить по одному.Поэтому я хотел бы иметь скрипт (php), который может работать во многих параллельных экземплярах (процессах), получая некоторую сумму из db и обрабатывая ее.Другими словами, каждый процесс должен работать с определенным диапазоном данных.Я также хотел бы остановить каждый процесс и иметь возможность продолжить отправку сообщения от остановленного пользователя другому набору пользователей, которые еще не получили сообщение.Если это возможно?Любые советы и рекомендации приветствуются.

Ответы [ 3 ]

0 голосов
/ 04 октября 2011

Параллельная обработка возможна только в пределах конфигурации вашего сервера. Многие серверы могут обслуживать страницы в параллельном режиме, но, опять же, он ограничен несколькими. Вместо этого эмпирическое правило должно быть максимально быстрым и переходить к следующему запросу.

Относительно вашей обработки действительно большого списка данных в вашей базе данных. Прежде всего, вам потребуется список идентификаторов для рассылки, которую вы делаете:

INSERT INTO `mymailinglisttable` (mailing_id, recipient_id, senton) SELECT 123 AS mailing_id, mycontacttable.recipient_id, NULL FROM mycontacttable WHERE [insert your criterias for your contacts]

Далее вам понадобится либо innodb, либо какая-нибудь умная логика для параллельной обработки:

С InnoDB вы можете сделать некоторую блокировку на уровне строк, но не спрашивайте меня, как, ищите это сами, я вообще не использую InnoDB, но я знаю, что это возможно. Таким образом, вы читаете документы по этому вопросу, выбираете и блокируете несколько строк, отправляете электронные письма, помечаете как отправленные и стираете, повторяете операцию, вызывая свой собственный скрипт. (Либо с AJAX, либо с php-сокетом)

Без InnoDB вы можете просто добавить 2 поля в базу данных, одно из которых является processid, а другое - заблокированным. Если вы хотите заблокировать некоторые адреса для вашей обработки, выполните:

$mypid = getmypid().rand(1111,9999);
$now = date('Y-m-d G:i:s');
mysql_query('UPDATE mymailinglisttable SET mypid = '.$mypid.', lockedon = "'.$now.'" LIMIT 3');

Это заблокирует 3 строки для вашего pid, и в текущее время выберите строки, которые были заблокированы, используя:

mysql_query('SELECT * FROM mymailinglisttable WHERE mypid = '.$mypid.' AND lockedon = "'.$now.'")

Вы получите 3 строки, которые вы правильно заблокировали для обработки. Я склонен использовать эту версию больше, чем версию innodb, потому что я вырос с этим методом, но не потому, что он более производительный, на самом деле, я уверен, что версия InnoDB намного лучше, просто никогда не пробовал.

0 голосов
/ 04 октября 2011

Если вы знакомы с использованием модулей PEAR, я бы рекомендовал взглянуть на модуль pear Mail_Queue.

http://pear.php.net/package/Mail_Queue

Хорошо задокументировано и с хорошим руководством.Я использовал модифицированную версию этого прежде, чтобы отослать тысячи электронных писем клиентам, и это еще не доставляло мне проблемы:

http://pear.php.net/manual/en/package.mail.mail-queue.mail-queue.tutorial.php

0 голосов
/ 04 октября 2011

Возможно, вы захотите установить задание cron, обычно один из лучших подходов для запуска больших пакетных операций с PHP-скриптами:

http://www.developertutorials.com/tutorials/php/running-php-cron-jobs-regular-scheduled-tasks-in-php-172/

Ваша работа cron должна указывать на скрипт PHP, который выполняет следующие действия:

  1. Выбирает подмножество получателей из вашей большой таблицы БД на основе установлен флаг # 3 (ниже), обозначающий следующую партию для обработки
  2. Отправить электронное письмо выбранным получателям
  3. Сохраняет заметку о текущей / неудачной работе (т. Е. Вы можете установить флаг рядом с каждым получателем в БД, который успешно отправляется по почте, они не выбираются при повторном выполнении задания)
...