我正在寻找一种技术来做到以下几点,我需要你的建议。 我有一个巨大的(真的)表注册ID,我需要向这些ID所有者发送消息。我不能立即将消息发送给许多收件人,这需要一个接一个地进行。所以我希望有一个脚本(php)可以在许多并行实例(进程)中运行,从db获取一些数量并处理它。换句话说,每个进程都需要使用特定范围的数据。我还想停止每个进程,并能够继续从已停止的用户发送消息到另一组没有收到消息的用户。 如果它是可能的?欢迎任何提示和建议。
答案 0 :(得分:0)
您可能希望设置一个cron作业,通常是使用PHP脚本运行大批量操作的最佳方法之一:
您的cron作业需要指向执行以下操作的PHP脚本:
答案 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