批量数据处理技术

时间:2011-10-04 11:57:10

标签: php message bulk

我正在寻找一种技术来做到以下几点,我需要你的建议。 我有一个巨大的(真的)表注册ID,我需要向这些ID所有者发送消息。我不能立即将消息发送给许多收件人,这需要一个接一个地进行。所以我希望有一个脚本(php)可以在许多并行实例(进程)中运行,从db获取一些数量并处理它。换句话说,每个进程都需要使用特定范围的数据。我还想停止每个进程,并能够继续从已停止的用户发送消息到另一组没有收到消息的用户。 如果它是可能的?欢迎任何提示和建议。

3 个答案:

答案 0 :(得分:0)

您可能希望设置一个cron作业,通常是使用PHP脚本运行大批量操作的最佳方法之一:

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

您的cron作业需要指向执行以下操作的PHP脚本:

  1. 根据a从大型数据库表中选择收件人的子集 标志设置在#3(下面),标识要处理的下一批
  2. 向选定的收件人发送电子邮件
  3. 保存当前作业位置成功/失败的记录(即您可以设置一个 数据库中成功邮寄的每个收件人旁边的标记,然后在重新运行作业时不会选择这些标记。)

答案 1 :(得分:0)

只能在服务器配置范围内进行并行处理。许多服务器可以以并行方式提供页面,但是再次,它仅限于少数几个。相反,经验法则是尽可能快并跳转到下一个请求。

关于处理数据库中非常大的数据列表。首先,您需要一个您正在进行的邮件的ID列表:

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,另一个是lockedon字段。如果要锁定某些地址以进行处理,请执行以下操作:

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

这将为您的pid锁定3行,并在当前时间,选择使用以下锁定的行:

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

您将检索正确锁定以进行处理的3行。我倾向于使用这个版本比innodb版本更多因为我用这种方法提出但不是因为它更高性能,实际上,我确信InnoDB的版本好得多,从未尝试过。

答案 2 :(得分:0)

如果您对使用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