Php 处理从守护进程读取队列项目的DB的最佳方法?

Php 处理从守护进程读取队列项目的DB的最佳方法?,php,queue,daemon,Php,Queue,Daemon,情况:用户提交一个url,我的php脚本将该url添加到数据库中的“队列”表中。假设每分钟至少有1000个URL插入到“队列”表中。我要对url做的是抓取url的内容,然后对内容进行快速解析 我的解决方案:正在考虑创建一个守护进程,它将不断检查“队列”表,并在每次检查时获取可用的行。然后处理检索到的数据,更新另一个表中的数据,然后在该循环完成时删除行,然后再次重复。每行可能需要1ms-3ms才能完成。(顺便说一句,我使用的是InnoDB表) 问题:那么你认为这是一种很好的方法吗?还是有更好的不过

情况:用户提交一个url,我的php脚本将该url添加到数据库中的“队列”表中。假设每分钟至少有1000个URL插入到“队列”表中。我要对url做的是抓取url的内容,然后对内容进行快速解析

我的解决方案:正在考虑创建一个守护进程,它将不断检查“队列”表,并在每次检查时获取可用的行。然后处理检索到的数据,更新另一个表中的数据,然后在该循环完成时删除行,然后再次重复。每行可能需要1ms-3ms才能完成。(顺便说一句,我使用的是InnoDB表)


问题:那么你认为这是一种很好的方法吗?还是有更好的不过,我不想使用任何繁重的系统,如果可能的话,我喜欢保持内容简短:)

一般来说,这种方法是可行的。尽管我建议您保持队列完整,并使用表格跟踪每个项目的进度。

我认为您一次只抓取一行,而不是所有行。原因如下:

假设您的表中有1000个条目,您的脚本出现,占用了内存中的所有1000个条目(警告标志1表示内存使用率高),并开始处理。处理1000个条目需要5分钟,但脚本每3分钟运行一次。这意味着,当您的第一个线程处理第674行(例如)时,您的第二个线程开始处理第1行,因为您的数据库尚未更新(警告标志2:多线程行为)

这也适用于让多个线程同时运行队列的情况

应用程序流程:

  • 脚本启动,获取带有“未处理”标志的第一行
  • 立即将其标志设置为“处理”
  • 处理该URL
  • 将标志设置为“已处理”

您还可以在数据库中使用行锁定,而不是使用标志。但这很容易出现死锁,所以要小心。

谢谢,这似乎是合理的。但是,如果一次只抓取一行,会不会给数据库带来更多的负载?或者,考虑到InnoDB使用行级锁定,这样可以吗?我不认为您的服务器会一直遭受抓取行的痛苦,它就是这样做的。但是,如果你有索引列,那么一直更新和/或插入会导致更大的负载,所以请记住这一点。我不明白你所说的“保留…”是什么意思。。。队列完整“?不删除行。将它们作为日志保存,并跟踪工作状态。