php工作者或队列处理器

php工作者或队列处理器,php,queue,amazon-sqs,Php,Queue,Amazon Sqs,背景/问题描述: 我甚至不知道如何寻找我想做的事情。我有一个需要处理的项目队列,我希望PHP每10秒(或任何增量)检查一次,看看队列中是否有任何内容。如果有,它应该开始处理它,但前提是它还没有处理另一个项目(例如,当处理需要30秒时,它不会处理多个项目)。我想我可以用一个锁文件之类的东西来破解“已经在处理”标志 我可能会将AWS SQS用于队列,并且有多个服务器并行运行 问题: 基本上,用户需要将一系列要异步完成的工作排队。所以我的问题是,如何安排PHP进行队列检查?我在看cronjobs,但它

背景/问题描述

我甚至不知道如何寻找我想做的事情。我有一个需要处理的项目队列,我希望PHP每10秒(或任何增量)检查一次,看看队列中是否有任何内容。如果有,它应该开始处理它,但前提是它还没有处理另一个项目(例如,当处理需要30秒时,它不会处理多个项目)。我想我可以用一个锁文件之类的东西来破解“已经在处理”标志

我可能会将AWS SQS用于队列,并且有多个服务器并行运行

问题:


基本上,用户需要将一系列要异步完成的工作排队。所以我的问题是,如何安排PHP进行队列检查?我在看cronjobs,但它们似乎只能每分钟运行。

我将从一个简单的循环开始。循环每10秒检查一次队列。如果那里有什么东西,它会处理它,花任何必要的时间。处理完成后,循环将在10秒循环中继续。

我建议您查看gearmand。如果此队列上有多台服务器,则每10秒和每1分钟有什么不同?例如,如果有6台服务器每分钟运行一次cron,则可以大约每10秒检查一次队列。您是否考虑过使用SNS作为SQS的通知机制?您希望项目多久排队一次?什么是队列中的项目必须以多快的速度处理的SLA?嗯,SNS看起来很有希望。这可能有助于使其更基于事件,而不是程序循环。是否可以将其设置为当新的内容准备就绪时,队列服务器通知处理服务器(以某种方式“订阅”该主题)?然后,每个处理服务器都可以抓取一个项目,对其进行处理,并检查是否还有其他事情要做。@rwilson04您只需使用SNS发布到http(s)端点,该端点可以是您服务前面的负载平衡器的DNS地址。对于每个通知,只有一个服务器(根据LB配置选择)将接收消息,并且能够从队列中拖出下一个项目来处理它。这样,如果您一分钟只收到一条消息,那么每分钟只有一台服务器运行您的脚本,而不是一堆服务器定期轮询队列是否已更改。这更像是一种“推”模式,而不是你正在考虑的“拉”模式。如果你总是在队列中有消息,那么@richard的答案是好的。如果你不会经常收到短信,那么像SNS这样的东西可能会很好。或者类似于IronMQ的警报:只是针对这种类型的东西。这可能不是一种可靠的方法。你会有一个永无止境的剧本吗?当进程死亡时会发生什么?如何处理跨多个系统的并发性?问题描述中没有关于多个系统的内容。这个过程应该从启动时开始,并一直持续下去。最初的问题是:“我可能将使用AWS SQS作为队列,并且有多个服务器并行运行”。这表明存在多个系统,因此存在并发问题。Mike,Richard是对的,这就是应该如何做的,这就是几乎所有工作系统的工作方式。任何数量的进程都可以请求队列中的消息来做一些工作,因为您有一堆消息,所以您有冗余来处理“当一个进程死亡时会发生什么?”问题。这里的并发问题是什么?