如何在后台作业laravel上处理多个api调用

时间:2018-02-09 09:45:06

标签: php laravel

我有一个后台工作,向谷歌和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调用失败时处理这种情况的最佳方法是什么,如果其中一个失败,那么我想记录失败并让工人继续前进?

3 个答案:

答案 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);