需要记住的几点:
我传递给api的查询的估计成本为502,由requestedQueryCost表示。然而,actualQueryCost表示api为特定车间返回的实际响应
在上面的快照中,这是最坏的情况,对于订单量大的商店,requestedQueryCost等于AcultalQueryCost
现在,当执行此查询时,我已经消耗了502个点,剩余498个点,经过了1秒,添加了50个点=548个点,并且我可以进行第二次api调用以获取第二页数据。在第二次api调用之后,我剩下的点数会更少,所以我必须将睡眠时间延长1或2秒,以获得进行api调用所需的点数
在快照中所示的情况下,我必须等待10秒才能恢复500个点以进行下一次api调用<问题:如何最好地确定不同商店的睡眠(等待)时间?我们不希望所有商店等待10秒,即使它们的查询成本更低
注意:有关代码参考,请参见下面我的答案。
你可以在每家商店获得一份完整的成本电话记录。如果一家店的价格为零,那么另一家店可能仍有1000英镑在等着你。你应该确保你的呼叫机制是明确的!每家商店只睡一根线。您应该能够将一个请求分配给一个线程,这样,如果它处于Hibernate状态,您仍然可以使用其他线程进行操作。如果PHP运行时为所有请求分配一个线程,我会笑得前仰后合。那太好了!
下面是我的解决方案草稿,仍在寻找如何有效处理它的专家意见,以便根据数据量,每个商店都必须等待他们应得的时间。请告知。
public function getRequiredOrders()
{
$firstRequestTimeStamp = now();
$ordersGraph = $this->shop->api()->graph($this->firstQuery())->body->orders;
$this->transform($ordersGraph); //transforming to required format
$previousRequestTimeStamp = $firstRequestTimeStamp;
while($ordersGraph->pageInfo->hasNextPage) {
$nextRequestTimeStamp = now();
$timeElapsed = $nextRequestTimeStamp->diffInSeconds($previousRequestTimeStamp);
$restoredPoints = $timeElapsed * 50; //50 points are restored every 1 second
$pointsLeft = $this->shop->api()->getApiCalls('graph', 'left');
$totalPointsLeft = $pointsLeft + $restoredPoints;
if($totalPointsLeft >=502){ //one must know the maximum cost of their query
$lastEdgeCursor = end($ordersGraph->edges)->cursor;
$nextQuery = $this->nextQuery($lastEdgeCursor);
$previousRequestTimeStamp = $nextRequestTimeStamp;
$ordersGraph = $this->shop->api()->graph($nextQuery)->body->orders;
$this->transform($ordersGraph);
}else{
sleep(1);
continue;
}
}
return $this->allOrders;
}