我要做一个循环过程,如:
- CRON运行脚本
process.php
,获取1000个url; -
process.php
与这些url一起工作(最多20分钟); - CRON再次运行
process.php
,我希望它采取下一个(不同)1000个url;
如何防止获取正在处理的url ?
公立小学 process.php
每10分钟运行一次
表格格式见上文
+----+------+
| id | url |
+----+------+
| 1 | url1 |
| 2 | url2 |
| 3 | url3 |
| 4 | url4 |
| 5 | url5 |
+----+------+
有很多方法可以满足这种"处理一次"的需求。选择通常取决于:
- 记录被"抓取"的速度
- 记录是否并行处理
- 如何处理处理失败
这里有一些想法:
使用队列
您可以使用Amazon Simple Queuing Service (SQS)创建队列。首先,运行一个作业,从数据库中提取url并将它们放入队列消息中。然后,process.php
可以从队列而不是数据库中读取详细信息。
脚本运行时,SQS消息是不可见的,因此其他进程无法获得它。当进程完成时,它应该从队列中删除消息。如果进程中途失败,则不可见的消息在预定义的时间间隔后重新出现以进行重新处理。
队列是处理大量记录的标准方式。它允许将处理分布在多个应用程序/服务器上。您甚至可以将单个url插入队列,而不是批处理。
标记为已在数据库中处理
添加一个processed_timestamp
列到数据库。处理URL时,在数据库上执行UPDATE
命令将URL标记为已处理。在检索url时,只处理具有而不是的SELECT
url。
记住上次处理
检索url时,存储"最后处理"的ID号。这可以存储在另一个数据库表、缓存、磁盘文件、S3文件或通常可访问的任何地方。然后,检索该值以确定接下来需要处理哪些记录,并在开始一批url时更新它。