百度推广 SEM闪投系统

 近期做了一个关于百度营销推广的一个管理系统(SEM闪投),主要包括闪投字段到数据库字段的关系映射,多库多表数据的查询封装组合到最后生成XML文件,最终SFTP到另一个资源服务器上,然后百度要能够访问这个XML并解析它,你在百度上搜索某个关键词的时候,最上面的几条带广告字样的,那么就达到效果了(关键是 money!!!)

在这过程中遇到了一些问题,也踩了不少坑。。在此记录一下;

第一步:多库多表的数据查询,从库里拿到元数据由于数据量以后会越来越大,首先计算出总的数据量,然后做分页查询,先查询主表的数据,每次查询的数据量为1000(可配置),然后根据查询的这1000条数据的主键ID循环查询其它扩展表的扩展表数据,到此第一次取元数据结束;

第二步:闪投字段赋值,分为以下几部分:
1.元数据与闪投字段映射关系中对应的字段作数据替换处理
2.映射字段中常量里的特殊字段进行替换操作。
3.通过第一次拿到的元数据,再去关联其它的库表进行查询得到数据,把拿到的数据
进行1一样的替换处理。

通过以上对数据的处理,已经得到最终输出到XML里的数据,这里会以每2000(可配置)条数据输出到一个XML文件里。

第三步:最后拿到处理好的数据,直接输出到XML文件里(在数据输出的时候又稍做了些替换,主要处理逻辑还是在第二步)

第四步:将生成的XML文件上传资源服务器。
在生成本地文件后,会有上传到远程服务器的动作,这里是个同步的操作,即我会记录
上传成功/失败状态,然后入库

遇到的问题及处理方案:
每次查询的数据量要可配置:
在查询数据的时候,每次查询的数据量不能固定写在程序里,由于每个环境的服务器配置及性能问题,以后更改方便,所以定义在配置文件里。

由于取扩展表数据的时候是in主表的主键ID,在实际生产环境里只配置了500,在每次输出数据到XML文件完成后,即要释放一次数据占用的内存;


保存数据到XML文件里遇到的问题:
即写入数据到XML文件的时候用的是file_put_contents,发现会有文件写的不完整,也就是文件还没写完,程序继续往下执行了,临时解决方案是sleep,但最终这里还是需要优化(后面会改成fwire);

写入XML文件内容中有用 <![CDTD[]]> 导致文件格式错乱,解析方案:Heredoc技术,如:

$S = <<<EOT
......
EOT;

XML文件上传到远程所遇到的问题:
上传文件用的SFTP,即上传文件完成后发现远程服务器上的文件数据并不完整,开发环境是正常的,测试环境上是不正常的,网上搜了些资料说每次上传完成后,要手动的关闭下会话链接,这样才会把缓存区的数据全部写入到磁盘,用sftp_exec(session, 'exit);但测试后发现好像并没能什么用呢,最后决定上生产环境,跑了下数据发
现并没有不完整。(在与环境做斗争。。)


频繁的数据查询导致的STMT_PREPARE问题:
即查询频率太大,最终的解决方案是每次都重新链接数据库进行查询。

 

posted @ 2017-02-17 16:27  wangyulu  阅读(772)  评论(1编辑  收藏  举报