如何与主管顺序执行laravel队列作业?

时间:2020-05-19 12:09:59

标签: laravel laravel-5.8 supervisord laravel-queue php-7.3

当用户点击网址时,我有一个排队的工作。

public function demoPR(Request $request) {
    // ...
    SavePRJob::dispatch($request->all(), $data);
}

和SavePRJob类

class SavePRJob implements ShouldQueue {
    private $inputs;
    private $data;

    public function __construct($inputs, $data) {
        $this->inputs = $inputs;
        $this->data = $data;
    }


    public function handle() {
        $inputs = $this->inputs;
        $prs = PR::whereIn('email', $input['emails'])->get();
        $bulkSave = array();
        foreach($data as $d){
            //if $d already exists in db, update it else collect data to save and bulk insert
            if($pr = $prs->firstWhere('email', $d['email'])) {
                $pr->num_t = $d['num_t'];
                //....
                $pr->save();
            } else {
                $bulkSave[] = $d;
            }
        }

        //bulk insert
        if(count($bulkSave) > 0) {
            //...
            PR::insert($bulkSave);
        }
        //...
    }

}

我已经按照here中的说明进行了主管配置。使用该配置,作业运行良好。为了测试多个用户同时点击相同URL的行为,我从Web浏览器的2个选项卡(即req1和req2)提交了Web请求。预期的行为是将执行req1的MyController@demoPR提交的作业,然后执行req2中的作业。当我查看日志时可以观察到这一点。通常,该工作大约需要2.5分钟。但是,当我查看日志时,作业被执行的时间差仅为1秒,这与我切换选项卡以提交另一个请求所花费的时间差相同。这意味着作业不会按顺序进行。

我的要求是按顺序执行它们,以完成项目的目标。

任何解决方案都值得赞赏。

谢谢。

0 个答案:

没有答案