如何在Laravel中发出非阻塞API请求

时间:2019-04-27 23:00:39

标签: php laravel api asynchronous

我在Laravel中创建了一个简单的API,用户可以通过POST对图片进行修饰。

在控制器中保存图像,然后将其发送到外部API进行分类。

此API调用需要花费几秒钟的时间,我不希望同时阻止我的Laravel应用。

我可以以某种方式异步运行它吗? 在PHP中有相当于节点的诺言吗?

编辑:我已经阅读了队列,但是在等待外部API回答时,工作进程也不会被阻塞吗?

2 个答案:

答案 0 :(得分:1)

您可以使用Laravel Queues将耗时的部分(例如api调用)延迟到后台作业。

  

队列使您可以将耗时的任务(例如发送电子邮件)的处理推迟到以后。推迟执行这些耗时的任务,可以大大加快对您的应用程序的Web请求。

答案 1 :(得分:0)

您可以考虑使用 Guzzle的承诺,并以并行方式发送请求。

该库位于此处:https://github.com/guzzle/promises

食人鱼客户端使用诸如...之类的魔术方法来包装承诺。

$promise = $client->getAsync('http://httpbin.org/get');
$promise = $client->deleteAsync('http://httpbin.org/delete');
$promise = $client->headAsync('http://httpbin.org/get');
$promise = $client->optionsAsync('http://httpbin.org/get');
$promise = $client->patchAsync('http://httpbin.org/patch');
$promise = $client->postAsync('http://httpbin.org/post');
$promise = $client->putAsync('http://httpbin.org/put');

...有关此文档,请参见:

枪口异步请求: http://docs.guzzlephp.org/en/stable/quickstart.html#async-requests

它具有一些概念,例如waitthenqueueresolve。这些帮助您在完全控制同步解决方案的同时发出异步请求。

使用此方法还可以检索汇总结果,例如,这意味着您可以查询users-api和projects-api并等待一些结果返回,以便可以创建一个包含来自两个来源的组合数据的json响应。

这对于实现API网关的项目非常整洁。