Laravel将控制权返回给来电者并继续工作

问题描述 投票:0回答:1

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

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

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

我正在使用Laravel 5.2和Guzzle的请求。

laravel request guzzle
1个回答
0
投票

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

从你的第一个api,你应该打电话给第二个api告诉它处理一些东西。

然后第二个api应该在收到数据后响应(不是一次处理)。

第一个API

use GuzzleHttp\Client;

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

然后第二个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中发出,qazxswpoi根据第二个api是否已确认完成该过程而重新排队(在延迟之后)。

如果这需要更清晰,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.