多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
> 在common 模块下 新建 behavior 文件夹 ,创建 AutoGrabOrder.php (示例) ``` <?php namespace app\common\behavior; use think\Db; use think\Queue; class AutoGrabOrder { public function run($param){ // 当轮到该任务时,系统将生成一个该类的实例,并调用其 fire 方法 $jobHandlerClassName = 'app\common\job\AutoGrabOrder'; // 2.当前任务归属的队列名称,如果为新队列,会自动创建 $jobQueueName = "AutoGrabOrder"; // 3.当前任务所需的业务数据 . 不能为 resource 类型,其他类型最终将转化为json形式的字符串 $jobData = [ 'id' => $param['id'], 'bizId' => uniqid()] ; // 4.将该任务推送到消息队列,延迟1小时 $isPushed = Queue::later($param['time'],$jobHandlerClassName , $jobData , $jobQueueName ); // database 驱动时,返回值为 1|false ; redis 驱动时,返回值为 随机字符串|false if( $isPushed !== false ){ //已加入队列 Db::name("job_begin_record")->insert([ 'data'=>json_encode($param), 'date'=>date("Y-m-d H:i:s",time()) ]); }else{ //任务开始失败 writeLog($param,"listen/job_begin_failed"); } } } ``` > 在common 模块下 新建 job 文件夹 ,创建 AutoGrabOrder.php (示例) ``` <?php namespace app\common\job; use think\Db; use think\Exception; use think\queue\Job; /** * Class AutoGrabOrder * @package app\common\job * 到时间自动解冻 冻结金额 */ class AutoGrabOrder { public function fire(Job $job, $data) { try { //你的处理逻辑 //处理完 删除队列 $job->delete(); } catch (Exception $exception) { // 队列执行异常 writeLog('queue-' . get_class() . '-AutoGrabOrder' . ':执行异常,错误信息:' . $exception->getMessage(), "listen/AutoGrabOrder"); } } /** * @param $data * 队列执行失败 */ public function failed($data) { Db::name("listen_failed")->insert([ "name" => "AutoGrabOrder", "data" => json_encode($data), "createtime" => time(), "updatetime" => time() ]); } } ``` > 调用 hook 队列 ,在 index 模块下 的 tags.php 添加监听 ``` // 'AutoGrabOrder'=>[ 'app\\common\\behavior\\AutoGrabOrder' ] ``` > 控制器里调用 ``` $da=["id"=>$id,"time"=>3600]; Hook::listen("AutoGrabOrder",$da); ``` > 宝塔安装 , Supervisor管理器 2.2 > 添加 守护进程 > 名称 填 AutoGrabOrder > 启动用户 选择 root > 运行目录选择 项目目录 > 启动命令 `php think queue:listen --queue AutoGrabOrder` > 进程数量 1 ***** > 如果启动失败 ,则 删除 php 的一些 禁用函数 , exec ,putenv, popen 等等