PHP Web服务队列

时间:2015-09-30 15:29:41

标签: php mysql web-services queue

我正在连接到一个Web服务,该服务只允许MAX(可能是1,5,10,具体取决于您的许可证)来自同一来源的并发连接。我需要一个能够实时(非异步)对Web服务进行队列请求的解决方案,确保只有MAX请求一次运行。

我目前正在设置工作:

$jobId = $this->queue->addJob($operation);               
while ( !$this->queue->canRunJob($jobId) ) {
  //error_log("Queue full, waiting");                     
   usleep(500);                                    
}
$this->queue->runJob($jobId);
...
$this->queue->completeJob($jobId);

这使用自定义队列类,它使用mysql表来跟踪作业,并计算正在运行和挂起的作业的数量。

$this->queue->addJob将新作业添加到数据库,状态为“待定”

$this->queue->canRunJob($jobId)检查有多少正在运行的作业。如果运行的作业少于MAX,它将按FIFO顺序从列表中获取下一个待处理作业。

PHP脚本循环并休眠,直到作业可以运行。

一旦canRunJob,它就会调用$this->queue->runJob($jobId),将队列中的作业更新为“正在运行”,并将请求发送到Web服务。

当webservice返回响应时,它调用$this->queue->completeJob($jobId),将队列中的作业更新为“completed”。

这种方法有95%的时间可以工作,但如果Web服务提供商陷入困境或完全陷入困境,它会慢慢导致我的服务器上的进程堆积,从而锁定Web和数据库连接。

寻找另一种处理此方案的方法的建议,无需循环/休眠

1 个答案:

答案 0 :(得分:0)

瞥一眼Symfony 2的Process组件。您将能够触发可以完成工作的子进程,例如: API连接。父级可以确保只触发n个子进程。将所有内容打包在一个循环中并查询其中的每个作业状态。