• 记:代码,非线性的世界中一抹深绿


        -----是为题

        MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。

        一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。

        -----引子

        在代码的世界,非0即TRUE,不会存在第三种情况,这也正是“事物”这一操作产生的必要。古今多少事,都是了而了之,最后不了了之。行百里者半九十。很多故事有一个非常好的开头,最后都不免留下一个狗血的结尾,或者更多的是没有后来。

        -----正文

        某一天,小白正在写代码,打开公司项目的摇一摇,发现出现一个异常。正常的是直接进到加载展示摇一摇页面,但是现在显示的是Https证书失效。前几天有顾客反映部分安卓用户摇一摇显示空白页,无法进入摇一摇页面。但是过一会摇一摇又正常可以进去,于是小白陷入迷惑中不自知。

        第二天,又有顾客反映还是无法进入摇一摇页面,小白感觉到事情可能有点严重。为什么之前摇一摇没有问题,突然就出现证书失效和部分安卓用户无法进入摇一摇页面。这一段时间没有进行任何业务功能的更改和代码的修改。那就应该是这个Https证书失效的问题,于是小白反馈到了上级,查看,果然是证书已到期。

        https证书到期的提示,才发现安卓手机和iOS手机提示是不一样的,iOS手机是可以直接提示出来,并且还有是否信任该链接,可以点击跳转的;但是安卓是直接不显示的,所以这就和最近顾客反映的部分安卓手机摇一摇页面空白对应起来了。“部分安卓手机”,小白自己iOS手机也是有时候提示证书到期,有时候正常。小白查询公司公众号后台,发现生成的摇一摇链接有些是带S的有些是不带S的,所以这也就和部分安卓用户,和有时候小白自己可以摇出来页面,有时候提示证书到期,原来是不同的设备和页面导致的。

        问题找到了,上级本来想给证书续费,才发现人事变更导致没有改账号,所以直接变换了域名当然重新购买了证书。因为小白公司项目是依托于公众号,所以用户对域名不敏感。因为所有的关于业务域名方向,都是采用动态获取的。所以在变更域名中,代码不需要做任何更改,只是需要把摇一摇设备已经生成的页面URL修改一下即可,虽然有上千个,但毕竟是直活,小白还是没有太多的反感,欣欣然然的处理着。周五,全部完成,小白也安心过周末。

    $_SERVER['HTTP_HOST']

        周六下午,公司反馈说新用户进入摇一摇异常,小白那时候正在图书馆,看海明威的《永别了,武器》,准确的说不是看,是在抄写,是的,因为此从离校或者说此从高中毕业后,小白就很少看书了,已经完全无法看书了,但是小白依旧想看书,怀念以前高中那种看书的心态和看到一些新的故事时候的高兴和收获。毕业后,小白虽然很少看书了,但小白还是一直在买书,小白相信小白有一天或者明天就会看的,至少想看的时候,书就在身边。后来小白发现问题像是有点大,所以小白就决定用抄写的方式来解决这个问题。

        

        小白瞄了一眼微信,发现提示是“页面失效,未知用户”。这个小白很熟悉,因为是他写的,用于在操作业务时,无法获取到当前用户信息的断点。这个提示的出现本身就是一个问题,正常到了操作业务时,不可能出现还没有获取用户信息的情况。那只能说明用户登陆出现了问题,但是登陆这一块小白一只很头疼,因为很繁琐,很杂乱,因为是一个二开的项目上更改的,登陆的问题很大,但也可以说不大,如果一个问题大到你已经无法处理了,那问题的处理就对你来说失去了意义。但是,正是因为这个登陆的问题,因为之前也是由于登陆导致部分用户出现错误页面,后来定位到也是由于未获取用户信息,就进行业务操作,导致的数据库空查询报错。也是由于一直是“部分”,所有后来,小白在基本熟悉新项目框架流程后,就着手把原来的登陆进行了重构,也不能说是重构把,在原先的基础上进行处理,基本算是9成的重构吧。因为小白对于当下已经上线的项目,还没有这么大的信心完全去重新。

        所有经过一周的测试和完善,迭代后登陆就再没有遇见先前的问题。“页面失效,未知用户”,这个提示使得小白很烦躁,像是让小白又想起了那段时间——错误已经出现,但是你无法找到错误产生的原因,你无法获取到错误的产生原因,你在不停的调试,尽你所能想到的,但是错误依旧出现,并且长时间你没有解决他。

        如果是登陆出现了问题,那说明之前努力做的迭代产品,依旧存在着问题。但是不可能,也许小白对那段时间太深刻了,以至于他不想这么早就怀疑自己的努力。因为后来的迭代是在完全吃透前面老兄写的流程后更改的,所以方向和跟随的脚步不应该有问题。况且,后来运行也一直没有在反馈出问题。

        小白的心里有点难受,觉得很烦躁,小白是那种心里装不住事情的人,次日下午,公司又反馈出有用户在激活礼品卡的时候报“调取接口失败,500”,激活卡卷只是一个简短的调起.NET写的接口的业务,没有任何冗余。小白自己在手机上尝试了一下,并没有发现任何异常,又是这个“部分”。

        周一,一大早小白就来到了公司。断点,记录,断点,记录,用户试图操作业务时,没有完成新用户的注册;查看新用户注册流程;发现新用户在调用微信接口获取用户信息时,这里就断掉了,但是实际又出现了授权页面。

        

        在小白后来迭代的代码里,在获取用户信息时,就没有往下走了,老猿对小白说这个弹窗授权页面没有出来。小白想也是,这个地方按道理应该出现一个页面的跳转,获取Code码,是的在这里断掉了。老猿淡然的指到你这里的Head头部是写死的“Http”,现在不是已经换成了“Https”吗。

        /**
         * 获取微信会员信息,弹出授权页面snsapi_userinfo
         */
        public function get_openid_info()
        {
            if (strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger')) {
                // 通过code获得openid
                if (empty($_GET['code'])) {
                    // 触发微信返回code码
                    if (! empty($_SERVER['QUERY_STRING'])) {
                        $query_string = "?" . $_SERVER['QUERY_STRING'];
                    }
                    $baseUrl = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] . $query_string;
                    $url = $this->get_authorize_url_userinfo($baseUrl, "123");
                    Header("Location: $url");
                    exit();
                } else {
                    // 获取code码,以获取openid
                    $code = $_GET['code'];
                    $data = $this->get_access_token($code);
                    $openid = $data;
                    // session('openid', $openid); //写入本地SESSION
                }
            }
            return $openid;
        }

        小白听完,加上一个S,上传,测试发现异常解决了。

        /**
         * 获取微信会员信息,弹出授权页面snsapi_userinfo
         */
        public function get_openid_info()
        {
            if (strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger')) {
                // 通过code获得openid
                if (empty($_GET['code'])) {
                    // 触发微信返回code码
                    if (! empty($_SERVER['QUERY_STRING'])) {
                        $query_string = "?" . $_SERVER['QUERY_STRING'];
                    }
                    $baseUrl = $_SERVER['REQUEST_SCHEME'].'://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] . $query_string;
                    $url = $this->get_authorize_url_userinfo($baseUrl, "123");
                    Header("Location: $url");
                    exit();
                } else {
                    // 获取code码,以获取openid
                    $code = $_GET['code'];
                    $data = $this->get_access_token($code);
                    $openid = $data;
                    // session('openid', $openid); //写入本地SESSION
                }
            }
            return $openid;
        }

        老猿对小白说,这个头部不知道为啥是写死的,其他项目我已经全部改过来了,这个没有改。小白想,这段获取用户对微信关注信息的,因为当时看这段是一个固定的逻辑业务,没有重点关注,直接复制过来用,所以没有考虑到代码的强壮性这一块。这个问题解决了,那么激活礼品卡失败,小白查看了自己写的日志,发现又是“部分”用户在获取输入账户及密码后就断掉了,这种情况之前遇见过一个就是获取Ip报错的一个低级错误导致,后来修复了。

        

        小白于是问上级,礼品卡上面是否有一个码了,可以供用户扫码直接进入项目,上级说说是的,有一个二维码,用户可以直接扫码进入到输入卡密和卡号的页面。小白明白了,新用户在拿到礼品卡后,直接扫码,进去到激活卡卷页面,程序检测到新用户,于是进行获取用户的信息,进行用户注册,在调用微信接口的时候,由于http已经变更为https所以这个跳转的URL已经失效,所以没有拿到用户信息。但往下走尝试操作业务时,便产生了一个空查询操作,接口报错导致,前端显示“接口调取失败,500”。

        于是小白,更改全部为动态获取和检查后,提交及回复了上级。

         

        -----结束

  • 相关阅读:
    Jeecms之查询实现
    JEECMS站群管理系统-- 自定义标签及使用自己创建的表的实现过程
    jeecms 修改后台访问路径
    Jeecms6中后台控制层Action如何将值传入前台视图层模板中的?
    原 JEECMS导入IDEA进行二次开发图文教程
    自己动手编写JEECMS自定义栏目统计标签
    深入浅出 Java Concurrency (8): 加锁的原理 (Lock.lock)
    深入浅出 Java Concurrency (7): 锁机制 part 2 AQS
    深入浅出 Java Concurrency (6): 锁机制 part 1 Lock与ReentrantLock
    深入浅出 Java Concurrency (5): 原子操作 part 4 CAS操作
  • 原文地址:https://www.cnblogs.com/camg/p/11152950.html
Copyright © 2020-2023  润新知