拉拉维尔将控制权交还给呼叫者并继续工作



>我有两个应该相互通信的API。第一个发送第二个文件,这些文件必须进行处理。但是,处理时间未知,可能需要一段时间。

我想到的解决方案如下 - 当处理准备就绪时,第二个 API 向第一个 API 发送包含结果的请求。 问题是,在所有这些时间里,第一个 API 的请求都在等待响应,因为我还没有返回控件,这会导致死锁。

我的问题是我怎样才能尽快将结果返回给第一个 API(类似于 received:true/false(,继续处理并在单独的请求中发送结果(来自处理(。

我正在使用 Laravel 5.2 和 Guzzle 来满足请求。

首先,这是概念证明,而不是工作代码,可能需要一些返工。

从第一个 API 开始,您应该调用第二个 api,告诉它处理某些内容。

然后,第二个 API 应在收到数据(而不是处理一次(后响应。

第一个接口

use GuzzleHttpClient;
public function callApiTwo(Request $request)
{
$client = new Client()
$data = [];

$res = $client->post('http://apitwoexample.com', [
'body' =>  json_encode($data)
]);
if ($res->getStatus() !== 203) {
// error in processing
}
$resData = json_decode($res->getBody()->getContents());
$token   = $resData['token'];
return response()->json([
'success' => 'Data is being processed',
'token'   => $token
], 202);
}

第二个接口

然后,第二个 api 应该接收数据(文件链接、图像、数据等(并调度作业(如@jonathon所述(。

然后,您需要某种标识符process/job/record.某种idtoken。这被发送回其响应中的第一个 api。

public function executeProcess(Request $request)
{
// Perform logic 
$token = str_rand(10);
Job::dispatch('/job/which/needs/time/to/run', [
'data'  => $data,
'token' => $token
]);
return response()->json([
'success' => 'Data is being processed',
'token'   => $token
], 202);
}
public function progressStatus(Request $request)
{
$model = Model::whereToken($request->token)->first();
return response()->json([
'status' => $model->status
], 200);
}

您会注意到progressStatus方法,我将其作为示例,通过某个标识符检查process/job/record的进程。

从第一个 API 中,可以在artisan命令或job中触发此操作,该命令根据第二个 API 是否已确认进程已完成而重新排队以再次触发(延迟后(。

让我知道这是否需要更清楚。

最新更新