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)

让我来解释一下这个例子

  • 用户点击按钮
  • 控制器中的运行函数触发器
  • 用户等待30秒,因为MyModel::doSomeThing需要很长时间才能处理
  • MyModel::doSomeThing可以做很多事情。我不希望用户等待它

    是否可以运行MyModel::doSomeThing而不关心结果并立即返回给用户

    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
    的作用是什么?