Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 海量数据处理技术_Php_Message_Bulk - Fatal编程技术网

Php 海量数据处理技术

Php 海量数据处理技术,php,message,bulk,Php,Message,Bulk,我正在寻找一种技术来做以下工作,我需要你的建议。 我有一个巨大的带有注册ID的表,我需要向这些ID所有者发送消息。我不能一次将信息发送给多个收件人,这需要一个接一个地进行。因此,我希望有一个scriptphp,它可以通过从db获取一些数据并对其进行处理,在许多并行实例进程中运行。换句话说,每个流程都需要处理特定范围的数据。我还希望停止每个进程,并能够继续从停止的用户向尚未收到消息的另一组用户发送消息。 如果可能的话?欢迎提供任何提示和建议。您可能希望设置cron作业,这通常是使用PHP脚本运行大

我正在寻找一种技术来做以下工作,我需要你的建议。 我有一个巨大的带有注册ID的表,我需要向这些ID所有者发送消息。我不能一次将信息发送给多个收件人,这需要一个接一个地进行。因此,我希望有一个scriptphp,它可以通过从db获取一些数据并对其进行处理,在许多并行实例进程中运行。换句话说,每个流程都需要处理特定范围的数据。我还希望停止每个进程,并能够继续从停止的用户向尚未收到消息的另一组用户发送消息。
如果可能的话?欢迎提供任何提示和建议。

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

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

从大型数据库表中根据 标记设置为下面的3,标识下一批要处理 向选定的收件人发送电子邮件 保存当前职位成功/失败的备注,即您可以设置 在DB中成功发送邮件的每个收件人旁边的标志,则在重新运行作业时不会选择这些收件人
并行处理仅在服务器的配置范围内可行。许多服务器可以以并行方式为页面提供服务,但也仅限于少数服务器。相反,经验法则是尽可能快地跳转到下一个请求

关于处理数据库中非常大的数据列表。首先,您需要一份您正在进行的邮件的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,您只需向数据库添加两个字段,一个是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的版本要好得多,只是从来没有尝试过它。

如果你对使用PEAR模块感到满意,我建议你看看PEAR邮件队列模块

有很好的文档和很好的教程。我以前使用过此版本的修改版本,向客户发送了数千封电子邮件,但还没有给我带来任何问题:


谢谢Tom,但实际上这些消息不是普通的电子邮件,而是android推送通知。因此,我需要处理发送我自己的消息。然后这可能会起作用:您可以这样从列表中选择:$threads=10//您运行了多少线程$thread_id=1//这是哪个PHP线程$sql='select*FROM list WHERE sent=0,id%'$线程。“=”$线程id;在这一点上,当在进程中间停止消息发送时,我们可以松开一些收件人。但也许我无法消除这种情况。我可能会丢失一些收件人,或者会发送其中一些收件人两次。不,使用我的版本,而不是innodb版本,可以在所有非SENTON的行上重置锁。你只在邮件不见时才设定发送日期。锁是为了防止两次选择行…抱歉,误解了你:那么你的意思是每次发送消息时我都必须更新senton?如果是的话,嗯。。这意味着定期更新不是很好。好吧,记住我们在这个板上说的只是建议,你应该选择最适合你的,并在必要时进行调整。这是成为一名优秀程序员过程的一部分…:同意:现在我想知道php处理部分。i、 e.如果我能得到前1000行,那么我应该得到下一组1000个我还没有发送消息的用户。我是否应该添加超时或其他内容。事实上,我不喜欢暂停的想法,但不知道我还能做什么。