当用户点击网址时,我有一个排队的工作。
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秒,这与我切换选项卡以提交另一个请求所花费的时间差相同。这意味着作业不会按顺序进行。
我的要求是按顺序执行它们,以完成项目的目标。
任何解决方案都值得赞赏。
谢谢。