我最近一直在做一些研究,以找到使用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调用吗?
谢谢,
答案 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调用应该重新排队。