# -*- coding: utf-8 -*- #!/usr/bin/python import pymysql import hashlib import json import urllib.request import base64 import tornado.ioloop import tornado.web import time import datetime import redis import os CONFIG_DIR = '' def IsOnlineEnv(): return os.getenv("SERVER_ENV"); if (IsOnlineEnv()): CONFIG_DIR = '/var/data/conf_test/game2001api_rankserver/config' else: CONFIG_DIR = '../config' #定时读取mysql里的数据生成排行榜写入redis后php读取redis返回客户端显示 def info(msg): print(str(datetime.datetime.now()) + '[INFO] ' + msg) def take_kills(elem): return elem[3] def take_alive_time(elem): return elem[4] def take_harms(elem): return elem[5] def take_win_times(elem): return elem[6] def take_game_times(elem): return elem[7] def safeDiv(a, b): if b == 0: return 0 else: return a / b def getRedis(): redis_conf = json.loadsmysql_conf = json.loads(open(CONFIG_DIR + '/rankserver.redis.cluster.json', 'r').read()) for conf in redis_conf: r = redis.Redis(host = conf['host'], port = conf['port'], password = conf['passwd'], charset = 'utf8' ) return r; def readMysqlData(rushtime): mysql_conf = json.loads(open(CONFIG_DIR + '/rankserver.mysql.cluster.json', 'r').read()) array = [] for conf in mysql_conf: conn = pymysql.connect(host = conf['host'], port = conf['port'], user = conf['user'], passwd = conf['passwd'], db = 'gamedb2001_' + str(conf['instance_id']), charset = 'utf8' ) cursor = conn.cursor() cursor.execute('SELECT accountid, user_name, avatar_url, kills, alive_time, harm, win_times, game_times FROM user;') for row in cursor: kill = safeDiv(row[3], row[7]) alive_time = safeDiv(row[4], row[7]) harm = safeDiv(row[5], row[7]) win_times = safeDiv(row[6], row[7]) array.append((row[0], row[1], row[2], kill, alive_time, harm, win_times, row[6])) r = getRedis() array.sort(key=take_kills, reverse=True) kill_rank = json.dumps(array) r.set("game2001api: kill_rank", kill_rank) array.sort(key=take_alive_time, reverse=True) alive_rank = json.dumps(array) r.set("game2001api: alive_rank", alive_rank) array.sort(key=take_harms, reverse=True) harm_rank = json.dumps(array) r.set("game2001api: harm_rank", harm_rank) array.sort(key=take_win_times, reverse=True) rate_rank = json.dumps(array) r.set("game2001api: rate_rank", rate_rank) array.sort(key=take_game_times, reverse=True) win_rank = json.dumps(array) r.set("game2001api: win_rank", win_rank) tornado.ioloop.IOLoop.current().call_later(rushtime, lambda : readMysqlData(rushtime) ) class SelfCheckingHandler(tornado.web.RequestHandler): def get(self): self.write(json.dumps({ 'errcode': 0, 'errmsg': '', 'healthy': 1, 'max_rundelay': 10 })) def make_app(): return tornado.web.Application([ (r"/webapp/index[\.]php", SelfCheckingHandler), ]) if __name__ == "__main__": conf = json.loads(open(CONFIG_DIR + '/rankserver.json', 'r').read()) app = make_app() app.listen(conf['listen_port']) conf['rushtime'] = 300 tornado.ioloop.IOLoop.current().call_later(conf['rushtime'], lambda : readMysqlData(conf['rushtime']) ) tornado.ioloop.IOLoop.current().start()