我在Laravel中创建了一个简单的API,用户可以通过POST对图片进行修饰。
在控制器中保存图像,然后将其发送到外部API进行分类。
此API调用需要花费几秒钟的时间,我不希望同时阻止我的Laravel应用。
我可以以某种方式异步运行它吗? 在PHP中有相当于节点的诺言吗?
编辑:我已经阅读了队列,但是在等待外部API回答时,工作进程也不会被阻塞吗?
答案 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
它具有一些概念,例如wait
,then
,queue
和resolve
。这些帮助您在完全控制同步解决方案的同时发出异步请求。
使用此方法还可以检索汇总结果,例如,这意味着您可以查询users-api和projects-api并等待一些结果返回,以便可以创建一个包含来自两个来源的组合数据的json响应。
这对于实现API网关的项目非常整洁。