Php 如何在Laravel中发出非阻塞API请求
我在Laravel中创建了一个简单的API,用户可以通过POST上传图像 在我的控制器中,我保存图像,然后我想将其发送到外部API以对其进行分类 这个API调用需要几秒钟的时间,我不想同时阻止我的Laravel应用程序 我可以异步运行它吗? PHP中是否有与node的承诺等价的东西 编辑:我读过队列,但是在等待外部API应答时,工作进程不会也被阻塞吗 您可以使用将耗时部分(如api调用)推迟到后台作业 队列允许您将耗时任务(如发送电子邮件)的处理推迟到稍后时间。延迟这些耗时的任务会大大加快对应用程序的web请求Php 如何在Laravel中发出非阻塞API请求,php,laravel,api,asynchronous,Php,Laravel,Api,Asynchronous,我在Laravel中创建了一个简单的API,用户可以通过POST上传图像 在我的控制器中,我保存图像,然后我想将其发送到外部API以对其进行分类 这个API调用需要几秒钟的时间,我不想同时阻止我的Laravel应用程序 我可以异步运行它吗? PHP中是否有与node的承诺等价的东西 编辑:我读过队列,但是在等待外部API应答时,工作进程不会也被阻塞吗 您可以使用将耗时部分(如api调用)推迟到后台作业 队列允许您将耗时任务(如发送电子邮件)的处理推迟到稍后时间。延迟这些耗时的任务会大大加快对应用
你可以考虑使用<强> GuScript承诺并在Palall中发送请求。 该库位于以下位置:
Guzzle客户用神奇的方法包装承诺,如$promise=$client->getAsync('http://httpbin.org/get');
$PROMITE=$client->deleteAsync('http://httpbin.org/delete');
$promise=$client->headAsync('http://httpbin.org/get');
$promise=$client->options异步('s)http://httpbin.org/get');
$PROMITE=$client->PATCHASNC('http://httpbin.org/patch');
$PROMITE=$client->postAsync('http://httpbin.org/post');
$promise=$client->putAsync('http://httpbin.org/put');
。。。相关文档可在此处找到:
Guzzle异步请求:
它有几个概念,如等待
,然后
,队列
和解析
。这些帮助您在完全控制解决同步问题的同时发出异步请求
通过这种方式,还可以检索聚合结果,这意味着,例如,您可以查询用户api和项目api,并等待部分结果返回,这样您就可以创建一个json响应,其中包含来自两个源的组合数据
这使得实现API网关的项目非常简洁。这难道不只是将阻塞推迟到工作进程吗?工作进程被阻塞没有问题;这不会影响应用程序的其余部分。我明白了,但是worker在处理大量API调用时不是非常无效吗?@mtthias取决于您运行的worker数量(您可以有多个)。但由于这是一个
队列
每个工人都将按顺序处理作业,因此不确定您使用什么指标来衡量“效率”