App

来源:互联网 发布:无缝拼接软件 编辑:程序博客网 时间:2024/04/26 01:06

问题描述:App 通过uri进行http协议传输时 有一些线上BUG查询起来没有什么头绪 为了解决这个问题进行优化和改进

解决方案 方案分为两部分:

业务线中读取PHP缓存,写入Redis 在脚本中,取出redis缓存 , 写入Log文件 代码如下。

    /**     * @var继承的子类如有构造方法、记得调用父类方法、验证登录     */    public function __construct(){        parent::__construct();        // 登录验证        if($this->_auth)            $this->auth();        // 初始化api调用记录 在这里开启缓冲区         ob_start();        // 检查接口是否停用        $this->checkForbidRoute();    }    /**     * 记录日志     */    public function __destruct(){        # 获取php执行后缓冲区的内容        $content = ob_get_contents();        # 输出缓冲区的内容、并关闭缓冲区        ob_end_flush();        # 开始处理日志记录 如果不做登录验证的不记录日志    }   #page层使用redis后 上个连接将不可用 重新获取   $redis  = new Redis();   $result = json_encode($apiLogRows);   $redis->rpush($redis_key,$result);   //在开始时调用 在对象执行结束时获取内容 Push到队列中

在接口通过http请求时 按照请求的顺序和需要的字段 写入Redis队列中 下一步就是取出数据 写入log 代码如下…

# 获取redis对象$redis = getRedis();# 队列名称$queue_name = Api_App_SystemConfig::CLIENT_API_LOG_KEY;# 队列名称$login_queue_name = Api_App_SystemConfig::LOGIN_API_LOG_KEY;# 开始时间$startTime = getmicrotime();# 读取环境$dev = strtolower(MainCommonConfig::RUN_MODE) == 'dev';# 测试十二小时执行一次 线上一小时执行一次$execut_time = $dev ? 60*60*12 : 60*60;do{    $row = $redis->lpop($queue_name);     $login_row = $redis->lpop($login_queue_name);     if(!$row&&!$login_row){        # 休息一秒        sleep(1);    }else{        if(!empty($row)){            $data = json_decode($row,true);            # 写入日志文件 类本身已经做了缓存            Gj_Logger::getLogger('clientApiAccess','/log')->info($data);             # 线上只记录日志 测试记录表和日志            if($dev){                $data['client_ip'] = ip2long($data['client_ip']);                $data = array_map(function($val){return is_array($val)?json_encode($val,JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE):$val;},$data);             #   addClientapiAccessLog($data);               }        }        if(!empty($login_row)){            $login_data = json_decode($login_row,true);            # 写入日志文件 类本身已经做了缓存            Gj_Logger::getLogger('clientApiAccess','/log')->info($login_data);         }    }}while((getmicrotime()-$startTime)<=$execut_time);# 脚本每小时执行一次

这里写图片描述

谢谢大家的阅读~~有疑问的小伙伴在底下留言我 我会及时回复你~

0 0
原创粉丝点击