HttpServerDataInf.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  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\DataLogic;
  12. use Illuminate\Database\Capsule\Manager as DB;
  13. class HttpServerDataInf
  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. $this->httpserver->account = new \swoole\Atomic();
  23. $this->httpserver->taskWorkingNum = new \swoole\Atomic();
  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. /*
  32. $name = $serv->taskworker ? 'Task_' : 'Worker_';
  33. $name = 'Data_' . $name . ($serv->worker_id < 10 ? '0' . $serv->worker_id : $serv->worker_id);
  34. swoole_set_process_name($name);
  35. */
  36. $GLOBALS['model'] = '';
  37. $GLOBALS['modeltime'] = 0;
  38. $this->InitDb();
  39. if ($serv->worker_id == 0) {
  40. \Swoole\Timer::tick(60000, function () {
  41. $this->logRunStatus();
  42. });
  43. }
  44. if ($serv->worker_id == 1) {
  45. \Swoole\Timer::tick(3000, function () {
  46. if ($this->httpserver->taskWorkingNum->get() > 1) {
  47. $this->httpserver->taskWorkingNum->sub();
  48. }
  49. });
  50. }
  51. }
  52. private function logRunStatus()
  53. {
  54. echo date('Y-m-d H:i:s') . " 总请求数:" . $this->httpserver->account->get() . ' 运行任务数:' . $this->httpserver->taskWorkingNum->get();
  55. echo ' work_id:' . $this->httpserver->worker_id . " 内存使用量:" . (memory_get_usage() / 1000) . 'k 峰值:' . (memory_get_peak_usage() / 1000) . "k\n";
  56. }
  57. public function OnRequest($request, $response)
  58. {
  59. $response->header('Content-Type', 'text/html; charset=utf-8');
  60. $response->header('Server', 'DataInfaceServer');
  61. $now = explode(" ", microtime());
  62. $paras = array_merge(['request_time' => date("H:i:s", $now[1]) . substr($now[0], 1, 5)], !empty($request->get) ? $request->get : [], !empty($request->post) ? $request->post : []);
  63. $this->httpserver->account->add();
  64. $request_uri = substr($request->server['request_uri'], 1);
  65. $urls = ['setLeague', 'setMatch', 'setMatchResult', 'setOdds', 'setOddsCH', 'setBroadCast', 'upMatch', 'setResultExpress', 'setMatchWarn', 'HandleOrder'];
  66. if (!in_array($request_uri, $urls)) {
  67. $data = Response::generate('', 0, '', '无效的url');
  68. $response->end($data);
  69. return;
  70. }
  71. $dataObj = json_decode($paras['data'], true);
  72. if (empty($dataObj)) {
  73. $data = Response::generate('', 5, '', '无效的data参数');
  74. $response->end($data);
  75. return;
  76. }
  77. if ($this->httpserver->taskWorkingNum->get() > intval($this->config['sets']['task_worker_num'])) {
  78. $str = $this->httpserver->taskWorkingNum->get() . '/' . $this->config['sets']['task_worker_num'];
  79. $data = Response::generate('', 9, '', '任务线程已满,请稍等...' . $str);
  80. $response->end($data);
  81. return;
  82. }
  83. $check_token = true;
  84. if ($check_token) {
  85. $token = isset($paras['token']) ? $paras['token'] : '';
  86. if (empty($token) || empty($this->Tokencheck($token))) {
  87. $data = Response::generate('', 6, '', '无效的token');
  88. $response->end($data);
  89. return;
  90. }
  91. }
  92. //$this->onTask($this->httpserver, ['url' => $request_uri, 'paras' => $paras, 'respone' => $response]);
  93. $this->httpserver->task(['url' => $request_uri, 'paras' => $paras]);
  94. $data = Response::generate('', 1, '');
  95. $response->end($data);
  96. return;
  97. }
  98. public function onTask($serv, $task)
  99. {
  100. $this->httpserver->taskWorkingNum->add();
  101. try {
  102. $url = $task['url'];
  103. $data = $task['paras'];
  104. switch ($url) {
  105. case 'setLeague':
  106. $ret = DataLogic::getInstance()->setLeague($data);
  107. break;
  108. case 'setMatch':
  109. $ret = DataLogic::getInstance()->setMatch($data);
  110. break;
  111. case 'setMatchResult':
  112. $ret = DataLogic::getInstance()->setMatchResult($data);
  113. break;
  114. case 'setOdds':
  115. $ret = DataLogic::getInstance()->setOdds($data);
  116. break;
  117. case 'setOddsCH':
  118. $ret = DataLogic::getInstance()->setOddsCH($data);
  119. break;
  120. case 'setBroadCast':
  121. $ret = DataLogic::getInstance()->setBroadCast($data);
  122. break;
  123. case 'upMatch':
  124. $ret = DataLogic::getInstance()->upMatch($data);
  125. break;
  126. case 'setResultExpress':
  127. $ret = DataLogic::getInstance()->setResultExpress($data);
  128. case 'setMatchWarn':
  129. $ret = DataLogic::getInstance()->setMatchWarn($data);
  130. case 'HandleOrder':
  131. $ret = DataLogic::getInstance()->HandleOrder($data);
  132. default:
  133. $ret = 'false';
  134. break;
  135. }
  136. } catch (\Exception $e) {
  137. echo date('Y-m-d H:i:s') . ' ' . $e->getMessage() . ' - ' . print_r($task, true) . "\n";
  138. }
  139. if ($this->httpserver->taskWorkingNum->get() > 1) {
  140. $this->httpserver->taskWorkingNum->sub();
  141. }
  142. //$this->onFinish($serv, 0, $ret);
  143. }
  144. public function onFinish($serv, int $task_id, $data)
  145. {
  146. // print_r(['task_id' => $task_id, 'ret' => $data]);
  147. }
  148. private function Tokencheck($token)
  149. {
  150. $tokenvel = DB::table('system_user')->where(['token' => $token])->first();
  151. return $tokenvel;
  152. }
  153. private function InitDb()
  154. {
  155. $over_time = 60 * 5;
  156. $now = microtime(true);
  157. $debugmsg = 'manager_pid=' . $this->httpserver->manager_pid . ' master_pid=' . $this->httpserver->master_pid;
  158. $debugmsg .= ' worker_id=' . $this->httpserver->worker_id . ' worker_pid=' . $this->httpserver->worker_pid . ' istask=' . intval($this->httpserver->taskworker);
  159. if (!$GLOBALS['modeltime']) {
  160. $GLOBALS['modeltime'] = $now;
  161. $GLOBALS['model'] = $this->httpserver->worker_id;
  162. ModelBase::init();
  163. //echo "第一次建立数据库连接- $debugmsg .....\n";
  164. //echo $GLOBALS['modeltime'] . '--' . $GLOBALS['model'] . "\n";
  165. return;
  166. }
  167. if (($now - $GLOBALS['modeltime']) > $over_time) {
  168. $GLOBALS['modeltime'] = $now;
  169. $GLOBALS['model'] = $this->httpserver->worker_id;
  170. ModelBase::close();
  171. ModelBase::init();
  172. //echo "超时重连数据库-$debugmsg.....\n";
  173. //echo $GLOBALS['modeltime'] . '--' . $GLOBALS['model'] . "\n";
  174. return;
  175. }
  176. //echo "用的旧的连接-$debugmsg...." . $GLOBALS['modeltime'] . '--' . $GLOBALS['model'] . ".\n";
  177. }
  178. public function start()
  179. {
  180. $this->httpserver->start();
  181. }
  182. }