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作业返回数据_Php_Laravel_Api Design_Task Queue - Fatal编程技术网

Php 从Laravel作业返回数据

Php 从Laravel作业返回数据,php,laravel,api-design,task-queue,Php,Laravel,Api Design,Task Queue,我正在Laravel上为移动应用程序开发API 方法将向其他API发出请求,合并和过滤数据,更改其结构等 应用程序的一个要求是响应时间不超过30秒,或者根本不响应。所以,我必须尽可能多地重复请求。我试图意识到,在Laravel队列中,目前我的职业课上有类似的内容: private $apiActionName; public function __construct($apiActionName) { $this->apiActionName = $apiActionName;

我正在Laravel上为移动应用程序开发API

方法将向其他API发出请求,合并和过滤数据,更改其结构等

应用程序的一个要求是响应时间不超过30秒,或者根本不响应。所以,我必须尽可能多地重复请求。我试图意识到,在Laravel队列中,目前我的职业课上有类似的内容:

private $apiActionName;

public function __construct($apiActionName)
{
    $this->apiActionName = $apiActionName;
}

public function handle(SomeService $someService)
{
    return $someService->{$this->apiActionName}();
}
控制器中的此操作代码:

public function someAction()
{ 
    $data = $this->dispatch(new MyJob($apiActionName));
    return response()->json($data);
}
public function someAction()
{ 
    $job = new MyJob($apiActionName);
    $data = $this->dispatch($job);
    return response()->json($job->getResponse());
}
是的,我知道从工作中回报价值是个坏主意,但我希望这是可能的。但是,$this->dispatch()只返回排队的作业ID,而不是handle方法的结果

TL;DR:如何从排队作业返回数据,而不将其保存在任何位置,即使队列中有多次尝试?如果工作不适合这种情况,也许有人知道其他方法。如有任何建议,将不胜感激


提前谢谢

您在作业类中返回数据,但将$data分配给调度程序-请注意,dispatch()方法不是作业类的一部分

假设作业同步运行,您可以尝试以下操作:

private $apiActionName;
private $response;

public function __construct($apiActionName)
{
    $this->apiActionName = $apiActionName;
}

public function handle(SomeService $someService)
{
    $this->response = $someService->{$this->apiActionName}();
}

public function getResponse()
{
    return $this->response;
}
然后在控制器中:

public function someAction()
{ 
    $data = $this->dispatch(new MyJob($apiActionName));
    return response()->json($data);
}
public function someAction()
{ 
    $job = new MyJob($apiActionName);
    $data = $this->dispatch($job);
    return response()->json($job->getResponse());
}

显然,一旦移动到异步模式和队列,这将不起作用-在调用getResponse()时,响应还不存在。但这就是异步作业的全部目的:)

谢谢您的回复!问题是我需要在异步模式下运行它,否则在失败的情况下作业不会重复。我尝试使用getter遵循您的建议,然后在一个循环中检查getResponse(),但它不起作用(重试是否有其他id?)。顺便说一下,可以从非排队作业返回值,而无需getter:$data=$this->dispatchNow($job);在异步模式下,您将无法根据定义返回值,因为它将在一段时间后以异步模式运行。因此,您的作业必须将结果保存在某个位置,客户端/控制器必须通过轮询或实时流(websockets、pubsub)再次请求它。无论哪种方式,您都不能仅从异步作业返回结果。使用Laravel5.8尝试此操作时,结果无效。您需要使用
$this->dispatchNow
而不是
$this->dispatch
从$job->getResponse()获取更新的值;如果作业有一个速率限制器,并且达到该限制会使
$this->relase($seconds=10)
松弛,会发生什么情况?如果您想异步处理,我构建了它,它将使用缓存层将响应传输回原始任务(并阻塞,直到准备就绪)。