Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在Laravel中发出非阻塞API请求_Php_Laravel_Api_Asynchronous - Fatal编程技术网

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

Php 如何在Laravel中发出非阻塞API请求,php,laravel,api,asynchronous,Php,Laravel,Api,Asynchronous,我在Laravel中创建了一个简单的API,用户可以通过POST上传图像 在我的控制器中,我保存图像,然后我想将其发送到外部API以对其进行分类 这个API调用需要几秒钟的时间,我不想同时阻止我的Laravel应用程序 我可以异步运行它吗? PHP中是否有与node的承诺等价的东西 编辑:我读过队列,但是在等待外部API应答时,工作进程不会也被阻塞吗 您可以使用将耗时部分(如api调用)推迟到后台作业 队列允许您将耗时任务(如发送电子邮件)的处理推迟到稍后时间。延迟这些耗时的任务会大大加快对应用

我在Laravel中创建了一个简单的API,用户可以通过POST上传图像

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

这个API调用需要几秒钟的时间,我不想同时阻止我的Laravel应用程序

我可以异步运行它吗? PHP中是否有与node的承诺等价的东西

编辑:我读过队列,但是在等待外部API应答时,工作进程不会也被阻塞吗

您可以使用将耗时部分(如api调用)推迟到后台作业

队列允许您将耗时任务(如发送电子邮件)的处理推迟到稍后时间。延迟这些耗时的任务会大大加快对应用程序的web请求


你可以考虑使用<强> 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数量(您可以有多个)。但由于这是一个
队列
每个工人都将按顺序处理作业,因此不确定您使用什么指标来衡量“效率”