Laravel 如何避免控制器处理时用户花费很长时间等待
让我来解释一下这个例子Laravel 如何避免控制器处理时用户花费很长时间等待,laravel,laravel-5,Laravel,Laravel 5,让我来解释一下这个例子 用户点击按钮 控制器中的运行函数触发器 用户等待30秒,因为MyModel::doSomeThing需要很长时间才能处理 MyModel::doSomeThing可以做很多事情。我不希望用户等待它 是否可以运行MyModel::doSomeThing而不关心结果并立即返回给用户 function trigger(Request $request){ $id= $request->get('id'); MyModel::doSomeThing($id)
function trigger(Request $request){
$id= $request->get('id');
MyModel::doSomeThing($id); // this one take 30 sec.
return response()->json([], 200);
}
如果doSomeThing()方法的结果对您的响应不是必需的&可以在后台完成,我建议使用,它将使用队列在后台运行,用户不需要等待此过程完成。这个过程相当简单。创建事件,并使用以下两个命令监听事件:
php artisan make:event YourEvent
php artisan make:listener YourListener --event=YourEvent
然后,在$listen
数组下的App\Providers\EventServiceProvider
中注册事件和侦听器:
protected $listen = [
YourEvent::class => [
YourListener::class,
],
];
现在,当您解决了这个问题后,您需要构建您的事件实例。在新创建的方法中,在构造方法中添加以下内容:
public $yourModel;
public function __construct(YourModel $yourModel)
{
$this->yourModel = $yourModel;
}
创建模型后,需要编辑侦听器,这将为您提供所需的所有逻辑。在此句柄方法中,您将有权访问我们在事件中定义的$yourModel
实例:
public function handle(YourEvent $event)
{
// Access your model using $event->yourModel...
YourModel::doSomeThing($event->yourModel);
}
剩下要做的唯一一件事就是使您的侦听器可排队。您可以通过添加implements ShouldQueue
您的定义来完成此操作:
class YourListener implements ShouldQueue
{
//
}
现在,当我们完成所有设置后,您可以更改控制器代码以调用这个新创建的事件,并让队列处理所有逻辑:
function trigger(Request $request){
$id= $request->get('id');
YourEvent::dispatch($id); //Calling event which will handle all the logic
return response()->json([], 200);
}
应该是这样。我还没有测试过这段代码,所以如果您遇到任何问题,请告诉我。该方法
doSomeThing
的作用是什么?