<?php namespace App\Model; use Jenssegers\Mongodb\Eloquent\Model as Moloquent; class NodesModel extends Moloquent{ protected $connection = 'mongodb'; //库名 protected $collection = 'cron_nodes'; //文档名 protected $primaryKey = '_id'; //设置id protected $guarded = ['_id']; //设置字段黑名单 public $timestamps = false; // 获取所有节点 public function getlists($request) { $page = $request->input('page', 1); $limit = $request->input('limit', 10); $map['node_ip'] = $request->input('node_ip', ''); // 节点IP $map['status'] = $request->input('status', 0); $map['begin_time'] = $request->input('begin_time', '') ? strtotime($request->input('begin_time')) : ''; $map['end_time'] = $request->input('end_time', '') ? strtotime($request->input('end_time')) + 86399 : ''; $list = $this->where(function($query) use($map) { if ($map['node_ip']) { $query->where('node_ip', 'like', '%'.$map['node_ip'].'%'); } if ($map['status']) { $query->where('status', '=', intval($map['status'])); } // 创建时间 if(!empty($map['begin_time']) && !empty($map['end_time'])) { $query->whereBetween('create_time', [$map['begin_time'], $map['end_time']]); } else if(!empty($map['begin_time'])) { $query->where('create_time', '>=', $map['begin_time']); } else if(!empty($map['end_time'])) { $query->where('create_time', '<=', $map['end_time']); } }) ->orderBy('create_time', 'desc') ->orderBy('_id', 'desc') ->paginate(intval($limit), ['*'], 'page', $page) ->toArray(); $data = $this->handleData($list['data']); return ['code'=>0, 'msg'=>'获取成功', 'data'=>$data, 'count'=>$list['total']]; } // 处理数据 public function handleData($data) { if (empty($data)) return $data; foreach ($data as $k=>&$v) { $v['create_time'] = date('Y-m-d H:i:s', $v['create_time']); $v['update_time'] = $v['update_time'] ? date('Y-m-d H:i:s', $v['update_time']) : ''; } return $data; } // 获取节点,同时同步到mongo public function getNodes() { $url = Config('website.go_server').'worker/list'; $res = json_decode(curlApi($url), true); if (!$res || $res['errno'] != 0) return ['errcode' => 1, 'errmsg' => '节点获取失败']; if (!$res['data']) return ['errcode' => 1, 'errmsg' => '未获取到节点信息']; $exists_node = $this->lists('node_ip')->toArray(); // 已存在的节点 foreach ($res['data'] as $v) { if (in_array($v, $exists_node)) { // 存在则更新 $this->where('node_ip', $v)->update(['update_time' => time()]); } else { // 不存在则新增 $this->insert([ 'node_ip' => $v, 'status' => 1, 'create_time' => time(), 'update_time' => time(), ]); } } $diff = array_diff($exists_node, $res['data']); // 求差集,获取掉线节点 if (!$diff) return ['errcode' => 0, 'errmsg' => '获取节点成功,无掉线节点']; foreach ($diff as $val) { $this->where('node_ip', $val)->update(['status' => -1, 'update_time' => time()]); } return ['errcode' => 0, 'errmsg' => '获取节点成功']; } }