2020项目出现的问题总结

1.token 到时失效。没有实时更新。(通过暂时延长生效时间临时解决)
2.类的封装。面向对象,访问moka 北森的接口交互,封装成对应的可拆解的类。接口 封装成对应的方法。
(请求接口 记录对应的 参数和返回值 到 日志表 留存)日志入库方法封装类。
优化:统一的日志服务。阿里云 或 ELk。 可以快速定位问题。
问题:重要入库请求,要记录日志,防止丢请求时溯源。 before 和after 都要加。
3.快速记录文件日志代码模板

  $logStr = sprintf('step:RemitBank,admin_id:%s,post:%s',$admin_id,$postData);
       $this->toLog($logStr);
 private function toLog($string = '') {

        //$basePath = Yii::app()->basePath;
        $path = pathinfo(__FILE__);
        //设置路径目录信息
        $url = $path['dirname'] . '/../../../runtime/log_' . date('Ymd') . '.log';

        $dir_name = dirname($url);
        //目录不存在就创建
        if (!file_exists($dir_name)) {
            $res = mkdir(iconv("UTF-8", "GBK", $dir_name), 0777, true);
        }
        $fp = fopen($url, "a");
        fwrite($fp, date('Y-m-d H:i:s') . " " . $string . "\r\n");
        fclose($fp);
}

   $logStr = sprintf('step:access_log, actionId:%s #@@# tk:%s #@@# uid:%s #@@# rawBody:%s', $url, $access_token, $uid, $param_json);
        ToLog::write($logStr);

class ToLog extends Component
{
    public static function write($data){
        if( is_array($data) ){
            $data = json_encode($data);
        }

        //设置路径目录信息
        $url = \Yii::$app->getRuntimePath() . '/logs/business/' . date('Y-m-d') . '.log';
        $dir_name = dirname($url);
        //目录不存在就创建
        if (!file_exists($dir_name)) {
            //iconv防止中文名乱码
            $res = mkdir(iconv("UTF-8", "GBK", $dir_name), 0777, true);
        }
        $fp = fopen($url, "a");//打开文件资源通道 不存在则自动创建
        fwrite($fp, date('Y-m-d H:i:s') . " " . var_export($data, true) . "\r\n");//写入文件
        fclose($fp);//关闭资源通道
    }
}

4.model 和 service 的合理封装。公用的方法类的封装。
5.对接外边项目。对接飞书端接口。看飞书文档。产品文档。
6.指定日报模板。每日更新日报和问题汇总。
7. mysql 的null, 用 is null ,is not null,判断。 大于小于 等于和count 都筛不到null的记录。
连表时 on 右边条件不满足,也能筛出来, 和where 不满足 会过滤掉 的区别。
8.打款接口,1.做不可重复请求校验2.做一段时间一个账单只能打一次校验。防止重复提交和重复操作。
9.RPC的好处,直接写到model 就能被远程调用。 传参和返回值解析,就和调用本地方法一样。
10.检测定时任务异常时发邮件提醒

  (new ToLog())->registerShutdown();

  
    /**
     * 处理函数
     * 2020/12/10
     */
    public  function Shutdown(){
        $error=error_get_last();
        // var_dump($error);
        if($error!==null){
            $date= [$error['message'], $error['type'], $error['file'], $error['line']];

            self::sendMail($error);
            self::logException($date);
        }
    }

    /**
     * 注册处理函数
     * 2020/12/10
     */
    public  function registerShutdown(){

        register_shutdown_function([$this,'Shutdown']);
        restore_error_handler();

    }
     public static function sendMail($error){

        $text = "<p style='font-weight: bold;'>脚本名称:  " . implode(' ',$_SERVER['argv']) . "</p>";
        if(is_array($error)){

            $text.= "<p>type:" . $error['type'] . "</p>";
            $text .= "<p>message:" . $error['message'] . "</p>";
            $text .= "<p>file:" .$error['file'] . "</p>";
            $text .= "<p>line:" . $error['line'] . "</p>";
        }elseif($error instanceof \Throwable){
            $text.= "<p>code:" . $error->getCode() . "</p>";
            $text .= "<p>message:" . $error->getMessage() . "</p>";
            $text .= "<p>file:" .$error->getFile() . "</p>";
            $text .= "<p>line:" .$error->getLine(). "</p>";
            $text .= "<p>Trace:" .str_replace('#',"<br>#",$error->getTraceAsString()). "</p>";
        }
        \Helper::sendMail(['xxx@126.com'],"脚本错误报警",$text);
    }

11.获取异常调动链信息

$error->getLine()
$error->getTraceAsString())

12.不合理的问题,不要的代码 要及时删除。开发阶段的修改,比测试和上线后的修改,成本和风险都小。

13.注意代码或者sql的执行顺序。会影响最终结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值