过年后至今做的工作总结

我记得年前的时候自己在大看特看Golang和Docker,然后年后活来了,东西全鸽了……现在感觉东西至少做的七七八八了,可以写点东西总结一下。

但其实也只做了两个东西,惭愧,惭愧。

退款分析的数据端

这个需求最简单的理解就是从接口拉数据,然后整理好放到数据表里,其实表面上看逻辑倒不是太难,主要难在处理的过程上了。像是有些情况下的数据格式处理,有的是xml格式的,有的是直接用特定标识符,像是\n,\t之类的做分隔,然后处理的时候就需要做一下相关的内容。

        $line = strtok($reportResult, PHP_EOL);
        $headers = preg_split('/\t/', $line);
        $n = 0;
        $fbaReturns = [];
        $groupsKey = [];
        while ($line != false) {
            $line = strtok(PHP_EOL);
            $row = preg_split('/\t/', $line);
            if (empty($row[2])) {
                continue;
            }
            $list = array_combine($headers, $row);
            //对list进行处理……
        }

这段代码是当时一部分退货原始数据处理的函数。大概是根据\n来区分每行,\t来区分字段,用array_combine()来做键值匹配。

    $xmlData = simplexml_load_string($reportResult);
    $contentArray = json_decode(json_encode($xmlData), true);

这段代码是时处理原始数据格式是xml类型的数据函数,通过这样就可以将xml类型的数据转化成PHP数组。

然后就是数据入库的处理,拼装数据,在入库前做关键值查找,有相同的记录做更新然后释放掉,如果最后没有释放完,就说明有新数据,做批量插入就行。(其实这块一开始写的挺恶心的,为啥laravel不提供一个批量插入/更新的方法……updateOrCreate终究只能一个个访问,好慢。)

当然我处理的部分数据,还挺恶心的,没有关键值,也就是说,什么账号站点之类平常用来区分数据的字段的都一样,但是数值不一样,还好不用做更新,数据也是死的,最后就采取增量插入的方法,直接读上次插入数据的最后日期,从那个时候开始继续拉就好,当然,遇到了上次的结尾和这次的开头一样的这种情况,主要是时间点重合了,这样的话,我尝试的是在插入这次的数据前把上次的结尾部分数据删掉,这样的话,这次的数据里有上次结尾的数据,不会漏数据,也不会有重复数据。

然后比较难的地方个人感觉是做数据库分表……我一开始以为分表是后边运维做的,他们可以把大表切割成小表,就像winrar压缩包的时候可以手动分卷……然而想的有点天真,实际情况是写程序去选择分表,然后就可能会出现各种各样的问题,像是数据更新和插入选择分表的问题之类的,有点难。

一开始我想的是,表的数目不确定,那么就做个死循环,从某个时间点去找表里数据的最后时间之类的,从而确定哪一张是插入数据的表,结果在调试过程中频繁进入死循环……防不胜防,身心俱疲。最后的解决方法是,确定一个时间为起始点,当前时间为结束点,这样就可以保证这个时间范围内的分表都是存在的,然后寻找每张表里的最晚数据,以此来确定最晚数据存在的表,最晚数据的时间就可以确定插入数据的分表。

再就是存在更新情况的数据分表的问题,一开始也是纠结于更新和插入内容位于两张表的情况,最后想到的解决办法是,直接把数据在组装过程中就按时间分好组,这样的话,可以保证这个时间的数据一定就在这个时间对应的分表中,就不存在这个时间的数据插入到哪一个时间对应的分表中了。

差不多就是这些东西,其他的,我还研究了一下把时间按月切分之类的函数,结果到最后用不上了……(因为数据组装部分处理了)只能说一开始想的方案到最后不一定能用上。

通知任务推送脚本

这个简单来说也倒是不难,就是第一步推任务参数去一个系统,第二步处理这个系统后续返回的数据,加工完放到数据库中。其他的内容倒是不怎么见过了。

主要难的地方是,后面增加的需求,让把返回的body内容也保存下来,然后显示在界面上,当成网页展示。

简单来说上面那个系统就是个爬虫,它把获得的网页内容保存成了json文件,其中body字段存的就是字符串化的邮件内容html文档,我要怎么处理才能让它显示在页面上呢?

首先前端显示这里还是和之前一样,需要一个view页面,但是这个时候不需要添加其他内容了,使用{!!$str!!}可以把原始的$str内容显示出来。大概就是,如果$str是个html文档,那么它解析的时候就会按html来解析。接下来的就比较简单了,直接把它存到一个文件里面就好了。

总结

总的来说写的东西还是有一定的难度,可以学到一些东西,我在想,当我学不到什么东西的时候,就跑路。