AppServer.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <?php
  2. namespace loyalsoft;
  3. include_once __DIR__ . '/../main.php'; # 导入主要工具库
  4. /**
  5. * API入口
  6. * @author gwang (mail@wanggangzero.cn)
  7. */
  8. class AppServer {
  9. /**
  10. * The Main Entrance of App
  11. * @param Req $req
  12. * @return Resp
  13. */
  14. public function api($req) {
  15. $uniq = uniqid(); # 自己生成一个唯一串,作为此次处理过程的标记。
  16. $GLOBALS['deal-uid'] = $uniq; # 写入日志的时候带上,方便辨认同一个处理过程.
  17. $GLOBALS['zoneid'] = $req->zoneid; # 暂时未想到更好的方案
  18. $req->mem = gMem(); # 初始化并挂载CRedisUtil
  19. $err = self::BeforeProc($req); # 预处理
  20. my_Assert(ErrCode::ok == $err, $err); # 如果tk校验未通过
  21. $resp = self::Route($req); # 分发逻辑
  22. self::AfterProc($req, $resp); # 执行后处理逻辑
  23. $req->mem->close(); # 销毁已申请的资源
  24. return $resp;
  25. }
  26. /**
  27. * 预处理逻辑
  28. */
  29. private static function BeforeProc($req) {
  30. if (!GAME_ONLINE) {
  31. return ErrCode::ok; # 直接返回 0:成功
  32. }
  33. my_Assert(!config::Inst()->isBaned($req->uid), ErrCode::err_server_updating); # 检查封号
  34. if (self::isUpdating() # 检查是否处于更新阶段,暂停对玩家请求的响应。
  35. && !config::Inst()->isTester($req->uid)) { # 排除测试号
  36. return ErrCode::err_server_updating;
  37. }
  38. $ssd = GameConfig::service_schedule_getItem(1); # 服务计划(固定只有1条)
  39. if (now() > $ssd->startts && now() < $ssd->endts) { # 在维护期间
  40. Err(ErrCode::err_server_maintaining, $ssd->reason);
  41. }
  42. // todo: 检查clientVersion 判断是否应该强制升级
  43. if (now() - $req->ts > OFFSET_MSGTIME) { # 如果服务端客户端时间戳超过规定误差,则消息非法
  44. return ErrCode::err_outtime;
  45. }
  46. return ErrCode::ok; # 所有检查通过
  47. }
  48. /**
  49. * 后处理逻辑
  50. * @param Req $req
  51. * @param Resp $resp
  52. */
  53. private static function AfterProc($req, &$resp) {
  54. if ($req->userInfoChanged) { # 回写玩家数据
  55. if (!UserProc::setUserInfo($req->userInfo)) { # 失败, 改写返回值
  56. Err(ErrCode::err_innerfault, "回写玩家数据");
  57. }
  58. }
  59. if (isset($req->updateInfo)) { # 透传参数
  60. $resp->updateInfo = $req->updateInfo;
  61. }
  62. $resp->tag = arr2obj(array_merge((array) $resp->tag, (array) Resp::$ext_tag)); # 合并附加tag,
  63. $resp->events = Resp::$ext_events;
  64. GAME_ONLINE and self::LogCmd($req, $resp); # 记录操作日志
  65. CLog::flush(); # flush日志
  66. }
  67. /**
  68. * 新版: 使用pdo_mysql+dao版本
  69. * @param type $req
  70. * @param type $resp
  71. */
  72. private static function LogCmd($req, $resp) {
  73. $tablename = 'tab_op_log' . date('Ymd'); # 今天的表名
  74. $old_tablename = 'tab_op_log' . date('Ymd', now(-86400 * 21)); # 待删除的表名 日志保留21天
  75. $sql = sprintf('create table if not exists %s like `tpl_op_log_tab`;', $tablename); # 创建今天的表
  76. $sql .= sprintf('drop table if exists %s;', $old_tablename); # 循环删除以前的表
  77. $sql .= sprintf("insert into %s (`uid`,`zoneid`,`cmd`,`days`,`param`,`ret`) values ('%s', %d, %d, %d, '%s', '%s');", #
  78. $tablename, $req->uid, $req->zoneid, $req->cmd, # # Uid, zoneid, cmd
  79. (isset($req->userInfo) ? (tsDay() - tsDay($req->userInfo->game->baseInfo->firstLogin)) : 0), # # ps.留存天数
  80. JsonUtil::encode($req->paras), # # req->paras
  81. JsonUtil::encode($resp->result)); # # resp->result
  82. daoInst()->exec($sql); # 执行sql
  83. }
  84. /**
  85. * 路由方法
  86. * @param Req $req
  87. */
  88. private static function Route($req) {
  89. $proc = OpeCode::getProc($req->ope); # 映射处理模块.
  90. my_Assert($proc != "err", ErrCode::ope_err); # 未能找到对应的处理模块
  91. try {
  92. $resp = call_user_func(array($proc, 'procMain'), $req); # 调用对应的处理逻辑
  93. if (!($resp instanceof Resp)) { # 异常返回值
  94. Err(ErrCode::err_innerfault, JsonUtil::encode($resp));
  95. }
  96. return $resp; # 返回值
  97. } catch (\Exception $ex) { # 异常信息写入日志
  98. $msg = CommUtil::str2UTF8($ex->getMessage()); # 异常信息转下码
  99. // CLog::err("$msg\n " . $ex->getTraceAsString(), "AppServer"); # 日志中追加traceinfo
  100. Err(ErrCode::err_unknownn, "call_user_func got Exception: $msg"); # 返回给客户端
  101. }
  102. }
  103. /**
  104. * 返回是否处于更新中
  105. * @return boolean
  106. */
  107. private static function isUpdating() {
  108. $ts = now();
  109. if ($ts > glc()->updatingBeginTs && $ts < glc()->updatingEndTs) {
  110. return true;
  111. }
  112. return false;
  113. }
  114. }