如何在cron作业Laravel上处理多个API调用

时间:2018-03-09 09:43:45

标签: php laravel api

我最近一直在做一些研究,以找到使用Laravel中的cron作业执行多个API调用的最佳方法,但这并不成功。

所以我的问题是我必须向多家银行发送贷款申请,我的cron:

控制器:

.
.
foreach($banks as $bank){

 $job = $this->dispatch(SendToBank($transaction));

} 
.
.

然后是cron Job:

public function handle(){

  $response = app($this->bank)::sendApplication($this->transaction);

}

问题:

如何为作业添加延迟,因为api响应可能需要10秒才能完成。

我知道我可以做$job->delay(time)但是在我的情况下它不能按预期工作,因为foreach以光速射击工作。

当api呼叫失败时,我想失败那个工作并在15分钟后将其重新排队?

请注意,如果api调用失败$response将为空,我尝试的是在响应为空时抛出异常。但是当抛出异常时,它被视为失败的工作吗?

有人可以在cron作业上进行多个api调用吗?

谢谢,

1 个答案:

答案 0 :(得分:0)

你可以与guzzle并行执行多个调用: http://guzzle3.readthedocs.io/http-client/client.html#sending-requests-in-parallel

use Guzzle\Common\Exception\MultiTransferException;
use GuzzleHttp\Client;

$client = new Client();

try {
    $responses = $client->send(array(
        $client->get('http://www.google.com/'),
        $client->head('http://www.google.com/'),
        $client->get('https://www.github.com/')
    ));
} catch (MultiTransferException $e) {

    echo "The following exceptions were encountered:\n";
    foreach ($e as $exception) {
        echo $exception->getMessage() . "\n";
    }

    echo "The following requests failed:\n";
    foreach ($e->getFailedRequests() as $request) {
        echo $request . "\n\n";
    }

    echo "The following requests succeeded:\n";
    foreach ($e->getSuccessfulRequests() as $request) {
        echo $request . "\n\n";
    }
}

另一个选择是使用promises,虽然javascript(node)应用程序更适合这个,但有一些选项可以使用php: https://github.com/amphp/amp

我建议看看排队来处理你的电话。对于这些类型的技术挑战而言,这往往是最佳解决方案。 https://laravel.com/docs/5.6/queues

在这种情况下,您可以定义处理失败/成功的不同方法; 一个失败的api调用应该重新排队。