我正在连接到一个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和数据库连接。
寻找另一种处理此方案的方法的建议,无需循环/休眠
答案 0 :(得分:0)
瞥一眼Symfony 2的Process组件。您将能够触发可以完成工作的子进程,例如: API连接。父级可以确保只触发n个子进程。将所有内容打包在一个循环中并查询其中的每个作业状态。