# -*- 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/game2002api_rankserver/config' else: CONFIG_DIR = '../config' #定时读取mysql里的数据生成排行榜写入redis后php读取redis返回客户端显示 def info(msg): print(str(datetime.datetime.now()) + '[INFO] ' + msg) def take_score(elem): return elem[3] 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 = 'gamedb2002_' + str(conf['instance_id']), charset = 'utf8' ) cursor = conn.cursor() cursor.execute('SELECT accountid, user_name, avatar_url, score FROM user;') for row in cursor: score = row[3] array.append((row[0], row[1].decode('utf-8'), row[2], score)) r = getRedis() array.sort(key=take_score, reverse=True) score_rank = json.dumps(array) r.set("game2002api: score_rank", score_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()