我打算做一个循环过程,如:
process.php
,需要1000个网址; process.php
适用于这些网址(最多20分钟); process.php
,我想让它接下来(不同的)1000个网址; 如何防止获取已在进行中的网址?
P.S。
process.php
每10分钟运行一次
表格格式见上文。
+----+------+
| id | url |
+----+------+
| 1 | url1 |
| 2 | url2 |
| 3 | url3 |
| 4 | url4 |
| 5 | url5 |
+----+------+
答案 0 :(得分:1)
这种“一次性处理”要求有很多种方法。选择通常取决于:
以下是一些想法:
使用队列
您可以使用 Amazon Simple Queuing Service(SQS)创建队列。首先,运行一个从数据库中提取URL并将它们放入队列消息的作业。然后,process.php
可以从队列而不是数据库中读取详细信息。
当脚本运行时,SQS消息不可见,因此其他进程无法获取它。该过程完成后,它应该从队列中删除该消息。如果进程在中途失败,则在预定义的时间间隔之后重新出现不可见消息以进行重新处理。
队列是处理许多记录的标准方法。它允许处理分布在多个应用程序/服务器上。您甚至可以将单个URL插入队列而不是批处理。
将其标记为已在数据库中处理
向数据库添加processed_timestamp
列。处理URL时,在数据库上执行UPDATE
命令以将URL标记为已处理。检索网址时,只处理未的SELECT
个网址。
请记住上次处理
检索网址时,请存储“上次处理的”ID号。这可以存储在另一个数据库表,缓存,磁盘文件,S3文件或通常可访问的任何位置。然后,检索此值以确定下一个需要处理的记录,并在启动一批URL时更新它。