由于项目中再修改产品的同时要同步关联水单,删单,客保 等等数据。所以不可能等待所有都执行完毕以后再给客户端反馈。所以查阅资料,自己用tp框架写了个队列。在这里晒出来代码,以供大家参考。
思路
1,需要用到队列则扔到queue表中。
2,利用linux计划任务 * * * * * 去执行 CronMission方法
3利用 flock文件排它锁,保证单线程执行,避免重复执行
具体实现如下:
表:
CREATE TABLE IF NOT EXISTS `roav2_queue` (
`id` int(10) NOT NULL AUTO_INCREMENT,`taskpath` varchar(50) NOT NULL DEFAULT '',//任务路径
`param` text NOT NULL,//参数在这里使用serialize编译
`status` tinyint(4) NOT NULL DEFAULT '0',//状态0未执行,1执行过
`created_at` datetime NOT NULL,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
1,获取队列
public function getQueueTask($limit = 10) { $map = ['status' => 0]; $data = $this->where($map)->order('id asc')->limit($limit)->select(); // var_dump(M()->getLastSql());die; return $data; }
2,参数拼接
public function cmdHandle($phpCmd, $taskPath, $param) { $str = '';