httpserver = new \swoole\http\server($config['host'], $config['port']); $this->httpserver->set($config['sets']); $this->config = $config; $taskWorkingNum = new \swoole\Atomic(); $this->httpserver->taskWorkingNum = $taskWorkingNum; $this->httpserver->on('request', array($this, 'OnRequest')); $this->httpserver->on('WorkerStart', array($this, 'onWorkerStart')); $this->httpserver->on('task', array($this, 'onTask')); $this->httpserver->on('finish', array($this, 'onFinish')); } public function onWorkerStart($serv, $worker_id) { $name = $serv->taskworker ? 'Task_' : 'Worker_'; $name = 'Settelement_' . $name . ($serv->worker_id < 10 ? '0' . $serv->worker_id : $serv->worker_id); swoole_set_process_name($name); $GLOBALS['model'] = ''; $GLOBALS['modeltime'] = 0; if (!$serv->taskworker) { $this->InitDb(); } } public function OnRequest($request, $response) { $response->header('Content-Type', 'text/html; charset=utf-8'); $response->header('Server', 'DataInfaceServer'); $paras = array_merge(['request_time' => date("H:i:s")], !empty($request->get) ? $request->get : [], !empty($request->post) ? $request->post : []); $request_uri = substr($request->server['request_uri'], 1); $urls = ['WinFail', 'SettelementAll', 'SettelementSome']; if (!in_array($request_uri, $urls)) { $data = Response::generate('', 0, '', '无效的url'); $response->end($data); return; } if ($this->httpserver->taskWorkingNum->get()) { $data = Response::generate('', 9, '', '还有未完成任务请稍等...'); $response->end($data); return; } if ($request_uri == 'WinFail') { return $this->doWinFailse($request, $response, $paras); } if ($request_uri == 'SettelementSome') { return $this->doSettelementSome($request, $response, $paras); } if ($request_uri == 'SettelementAll') { return $this->doSettelementSome($request, $response, $paras); } return; } public function onTask($serv, $task) { $this->httpserver->taskWorkingNum->add(); if ($task['type'] == 'doWinFailse') { $this->Task_winfalse($serv, $task); } $this->httpserver->taskWorkingNum->sub(); } //胜负计算 private function doWinFailse($request, $response, $paras) { $logic_obj = new WinfailLogic(); $id = intval($paras['noticeid']); try { $noticeModel = $logic_obj->getNoticeDate($id); $AdapterObj = $logic_obj->getAdapterObj($noticeModel->game_code); $result = $logic_obj->getCompResult($noticeModel->game_code, $noticeModel->match_id); $moneySimples = $logic_obj->getSimplexData($noticeModel->game_code, $noticeModel->match_id); $matchs_1 = $logic_obj->getMatchRecords($noticeModel->game_code, $noticeModel->match_id, 1); $matchs_2 = $logic_obj->getMatchRecords($noticeModel->game_code, $noticeModel->match_id, 2); $RefClass = new \ReflectionClass($AdapterObj); if (!empty($matchs_1)) { while (true) { if ($this->httpserver->taskWorkingNum->get() > intval($this->config['sets']['task_worker_num'])) { co::sleep(100); } else { $now = array_shift($matchs_1); $paras = ['type' => 'doWinFailse', 'stype' => 1, 'matchModel' => $now, 'RefClass' => $RefClass, 'result' => $result, 'moneySimple' => $moneySimples[$now->batch_id][$now->match_id]]; $this->onTask($this->httpserver, $paras); } } } if (!empty($matchs_2)) { while (true) { if ($this->httpserver->taskWorkingNum->get() > intval($this->config['sets']['task_worker_num'])) { co::sleep(100); } else { $now = array_shift($matchs_2); $paras = ['type' => 'doWinFailse', 'stype' => 1, 'matchModel' => $now, 'RefClass' => $RefClass, 'result' => $result, 'moneySimple' => $moneySimples[$now->batch_id][$now->match_id]]; $this->onTask($this->httpserver, $paras); } } } unset($logic_obj, $noticeModel, $AdapterObj, $result, $moneySimples, $matchs_1, $matchs_2, $RefClass); } catch (\Exception $e) { unset($logic_obj); $data = Response::generate('', 10, '', $e->getMessage()); $response->end($data); } return; } //部分结算 private function doSettelementSome($request, $response, $paras) { } //全部结算 private function doSettelementAll($request, $response, $paras) { } ///// private function Task_winfalse($serv, $task) { echo "IN Task_winfalse".print_r([$task])."\n"; } public function onFinish($serv, int $task_id, $data) { } private function InitDb() { $over_time = 60 * 5; $now = microtime(true); if (!$GLOBALS['modeltime']) { $GLOBALS['modeltime'] = $now; $GLOBALS['model'] = $this->httpserver->worker_id; ModelBase::init(); return; } if (($now - $GLOBALS['modeltime']) > $over_time) { $GLOBALS['modeltime'] = $now; $GLOBALS['model'] = $this->httpserver->worker_id; ModelBase::close(); ModelBase::init(); return; } } public function start() { $this->httpserver->start(); } }