HttpServerSettelement.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Administrator
  5. * Date: 2019/6/26
  6. * Time: 12:03
  7. */
  8. namespace datainf\logic;
  9. use App\Lib\ModelBase;
  10. use App\Http\Response\Response;
  11. use App\Logic\WinfailLogic;
  12. use Illuminate\Database\Capsule\Manager as DB;
  13. class HttpServerSettelement
  14. {
  15. private $httpserver;
  16. private $config;
  17. public function __construct($config)
  18. {
  19. $this->httpserver = new \swoole\http\server($config['host'], $config['port']);
  20. $this->httpserver->set($config['sets']);
  21. $this->config = $config;
  22. $taskWorkingNum = new \swoole\Atomic();
  23. $this->httpserver->taskWorkingNum = $taskWorkingNum;
  24. $this->httpserver->on('request', array($this, 'OnRequest'));
  25. $this->httpserver->on('WorkerStart', array($this, 'onWorkerStart'));
  26. $this->httpserver->on('task', array($this, 'onTask'));
  27. $this->httpserver->on('finish', array($this, 'onFinish'));
  28. }
  29. public function onWorkerStart($serv, $worker_id)
  30. {
  31. $name = $serv->taskworker ? 'Task_' : 'Worker_';
  32. $name = 'Settelement_' . $name . ($serv->worker_id < 10 ? '0' . $serv->worker_id : $serv->worker_id);
  33. swoole_set_process_name($name);
  34. $GLOBALS['model'] = '';
  35. $GLOBALS['modeltime'] = 0;
  36. if (!$serv->taskworker) {
  37. $this->InitDb();
  38. }
  39. }
  40. public function OnRequest($request, $response)
  41. {
  42. $response->header('Content-Type', 'text/html; charset=utf-8');
  43. $response->header('Server', 'DataInfaceServer');
  44. $paras = array_merge(['request_time' => date("H:i:s")], !empty($request->get) ? $request->get : [], !empty($request->post) ? $request->post : []);
  45. $request_uri = substr($request->server['request_uri'], 1);
  46. $urls = ['WinFail', 'SettelementAll', 'SettelementSome'];
  47. if (!in_array($request_uri, $urls)) {
  48. $data = Response::generate('', 0, '', '无效的url');
  49. $response->end($data);
  50. return;
  51. }
  52. if ($this->httpserver->taskWorkingNum->get()) {
  53. $data = Response::generate('', 9, '', '还有未完成任务请稍等...');
  54. $response->end($data);
  55. return;
  56. }
  57. if ($request_uri == 'WinFail') {
  58. return $this->doWinFailse($request, $response, $paras);
  59. }
  60. if ($request_uri == 'SettelementSome') {
  61. return $this->doSettelementSome($request, $response, $paras);
  62. }
  63. if ($request_uri == 'SettelementAll') {
  64. return $this->doSettelementSome($request, $response, $paras);
  65. }
  66. return;
  67. }
  68. public function onTask($serv, $task)
  69. {
  70. $this->httpserver->taskWorkingNum->add();
  71. if ($task['type'] == 'doWinFailse') {
  72. $this->Task_winfalse($serv, $task);
  73. }
  74. $this->httpserver->taskWorkingNum->sub();
  75. }
  76. //胜负计算
  77. private function doWinFailse($request, $response, $paras)
  78. {
  79. $logic_obj = new WinfailLogic();
  80. $id = intval($paras['noticeid']);
  81. try {
  82. $noticeModel = $logic_obj->getNoticeDate($id);
  83. $AdapterObj = $logic_obj->getAdapterObj($noticeModel->game_code);
  84. $result = $logic_obj->getCompResult($noticeModel->game_code, $noticeModel->match_id);
  85. $moneySimples = $logic_obj->getSimplexData($noticeModel->game_code, $noticeModel->match_id);
  86. $matchs_1 = $logic_obj->getMatchRecords($noticeModel->game_code, $noticeModel->match_id, 1);
  87. $matchs_2 = $logic_obj->getMatchRecords($noticeModel->game_code, $noticeModel->match_id, 2);
  88. $RefClass = new \ReflectionClass($AdapterObj);
  89. if (!empty($matchs_1)) {
  90. while (true) {
  91. if ($this->httpserver->taskWorkingNum->get() > intval($this->config['sets']['task_worker_num'])) {
  92. co::sleep(100);
  93. } else {
  94. $now = array_shift($matchs_1);
  95. $paras = ['type' => 'doWinFailse', 'stype' => 1, 'matchModel' => $now, 'RefClass' => $RefClass, 'result' => $result, 'moneySimple' => $moneySimples[$now->batch_id][$now->match_id]];
  96. $this->onTask($this->httpserver, $paras);
  97. }
  98. }
  99. }
  100. if (!empty($matchs_2)) {
  101. while (true) {
  102. if ($this->httpserver->taskWorkingNum->get() > intval($this->config['sets']['task_worker_num'])) {
  103. co::sleep(100);
  104. } else {
  105. $now = array_shift($matchs_2);
  106. $paras = ['type' => 'doWinFailse', 'stype' => 1, 'matchModel' => $now, 'RefClass' => $RefClass, 'result' => $result, 'moneySimple' => $moneySimples[$now->batch_id][$now->match_id]];
  107. $this->onTask($this->httpserver, $paras);
  108. }
  109. }
  110. }
  111. unset($logic_obj, $noticeModel, $AdapterObj, $result, $moneySimples, $matchs_1, $matchs_2, $RefClass);
  112. } catch (\Exception $e) {
  113. unset($logic_obj);
  114. $data = Response::generate('', 10, '', $e->getMessage());
  115. $response->end($data);
  116. }
  117. return;
  118. }
  119. //部分结算
  120. private function doSettelementSome($request, $response, $paras)
  121. {
  122. }
  123. //全部结算
  124. private function doSettelementAll($request, $response, $paras)
  125. {
  126. }
  127. /////
  128. private function Task_winfalse($serv, $task)
  129. {
  130. echo "IN Task_winfalse".print_r([$task])."\n";
  131. }
  132. public function onFinish($serv, int $task_id, $data)
  133. {
  134. }
  135. private function InitDb()
  136. {
  137. $over_time = 60 * 5;
  138. $now = microtime(true);
  139. if (!$GLOBALS['modeltime']) {
  140. $GLOBALS['modeltime'] = $now;
  141. $GLOBALS['model'] = $this->httpserver->worker_id;
  142. ModelBase::init();
  143. return;
  144. }
  145. if (($now - $GLOBALS['modeltime']) > $over_time) {
  146. $GLOBALS['modeltime'] = $now;
  147. $GLOBALS['model'] = $this->httpserver->worker_id;
  148. ModelBase::close();
  149. ModelBase::init();
  150. return;
  151. }
  152. }
  153. public function start()
  154. {
  155. $this->httpserver->start();
  156. }
  157. }