我有一个后台工作,向谷歌和facebook api发起api调用 我知道这些api的失败余地很小,但是由于我的应用程序取决于我从这些调用获得的数据,我想确保我的应用程序在api调用失败时不会卡住:
public function handle()
{
try {
$googleService = new GoogleClient;
$data = $googleService->report()
->from('AD_PERFORMANCE_REPORT')
->during('20170101', '20170126')
->select('
Impressions, CampaignId, Clicks, Ctr,Cost, AverageCost, Interactions, Conversions, Status, Id')
->getObject();
$this->transform->response($data->result);
$client = new FacebookClient;
$response = $client->insights()->select("impressions, ad_id, clicks,ctr, cpc,campaign_name ")->during('2013-01-01', '2018-01-31')->where(['accountid' => 'act_1222222'])->get();
$this->transform->response($response);
} catch (Exception $e) {
}
}
我已经研究了如何在api调用失败时处理作业,而没有帮助。
所以我的问题是: 当api调用失败时处理这种情况的最佳方法是什么,如果其中一个失败,那么我想记录失败并让工人继续前进?
答案 0 :(得分:0)
您可以使用Laravel Queues来完成此类任务。
Laravel队列提供了各种不同的统一API 队列后端,如Beanstalk,Amazon SQS,Redis,甚至是 关系型数据库。队列允许您推迟处理 耗时的任务,例如发送电子邮件,直到以后的时间。 推迟这些耗时的任务可以大大加快网络的速度 请求您的申请。
来自Laravel的官方网站。
答案 1 :(得分:0)
如果您的api调用失败但您的应用程序依赖于该响应,您应该尝试一次又一次地重试该调用,直到您得到正确的响应,您可能也会在请求之间使用超时,因此您无法获得Too Many Requests
回复。
如果您的api调用失败并且您的应用程序不依赖于响应,您可以使用记录器并在文件中记录错误并重试该调用,或者只是跳过它并继续。
但我同意@Amit Merchant你应该选择Laravel Queues
答案 2 :(得分:0)
Laravel有一些有趣的辅助函数,你应该研究一下。特别感兴趣的是retry功能。正如它暗示的那样,它重试回调中的任何内容的执行,直到A)没有抛出异常,或者B)它达到的最大阈值。
在处理失败状态之前,只需打包api调用并指定限制。
文档示例:
return retry(5, function () {
// Attempt 5 times while resting 100ms in between attempts...
}, 100);