2017年11月02日|记一次数据库类升级兼微信公众号服务器配置
前言
公司内有好几个托管微信公众号的遗留项目,在制作时由于项目需求简单,都没有用到框架。制作项目的前辈自己写了个MySQL的封装类,里面附带了几个常用的增删改查方法。而自从PHP5.5开始,mysql扩展就提示被弃用,在PHP7中,此扩展被移除,取而代之的是mysqli或pdo。
mysql_connectmysql_select_db
Warning:
This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used.
在后面的几个项目中,为了减少开发成本,在多个微信公众维护项目中沿用此封装类。而PHP7是一个趋势,为了跟上时代的脚步,组长指派我来改造此封装类,至于用mysqli还是pdo由我决定。
分析
好在所有的历史项目中都使用了继承封装类的模型来进行数据操作,而不是在控制器中直接使用封装类,这为此次升级带来很大便利。
先选一个项目进行试水,组长借来了公司的测试公众号供我随意测试。
选定目标
我曾经自己造过mysql,mysqli和pdo的轮子,但是只有pdo类曾经被应用到实际项目里,而pdo类编写得也比较完善,故选用pdo作为升级方向。
附上我自己造的pdo轮子的地址:
https://github.com/backwallkid/common-functions/blob/master/db/DbPdo.php
开始改造
根据之前分析的结果
- 只需将mysql类文件替换成pdo类文件。
- 再将模型继承的类名修改一下。
- 最后检查所有模型中调用封装类的函数,使输出结果保持相同。
测试
找公司的管理员讨了一组新的FTP+mysql,原来有的测试站使用的是和线上一样的环境,新的环境是使用最近其他项目常用的PHP7+MySQL5.6。
先将改造后的代码放在测试站中测试。
在存储微信昵称时碰到一点格楞,假如微信昵称中含有emoji字符,则数据插入失败,Pdo类记录到如下错误。Incorrect string value: '\xF0\x9F\x92\x94' for colum n 'wx_nickname' at row 1
根据搜索,有两种解决办法:
- 使用正则过滤掉所有的emoji字符,只存储正常字符串。
- 将数据表的charset改成utf8mb4
经过一系列的扫码关注、修改分组、自动应答、模板消息等功能测试通过。测试进入下一阶段。
管理员将测试站的域名指向新环境的地址后,过了十二小时。
在测试微信的获取用户信息接口时,微信接口会不定时返回{"errcode":40001,"errmsg":"invalid credential, access_token is invalid or not latest"}
。
这个错误一般是由于没有及时更新access_token导致的,而缓存access_token的数据表显示,表里记录的新获取的access_token不足10分钟。
此时突然灵机一动,去查看了原来测试站的数据库,发现旧环境中记录access_token的数据表的获取时间在新环境的缓存access_token的数据表的获取时间之后。
由此得出从微信接口发出的数据一部分会进入到旧的测试地址之内,即使域名已经切换了十二小时。
于是赶紧找网络管理员新造了一个域名,并且将此域名指向新环境。
在新域名生效后,没有再出现access_token过期的情况,新环境的测试也通过了。
后语
将测试结果上报给组长过目,但由于测试过程中呈现出来的不可预料的情况,域名修改指向后过了十二小时,依然有可能会访问到原来的地址。所以和组长讨论后找了个取巧的方法,使用两套数据库配置文件,旧FTP中保留程序,新FTP中仅access_token存取都读老数据库,其他数据存新库。将近一周后老库里其他表的数据不再新增了,说明新域名已完全生效。至此这次数据库类升级圆满完成。
微信公众号服务器迁移流程
- 布代码,数据库
- 打开valid接口,等api验证通过后再关闭
登录“公众平台”,左侧开发-基本配置,服务器配置-修改配置
左侧设置-公众号设置-功能设置,修改网页授权域名、JS接口安全域名
测试api
Reference
mysql扩展弃用警告 - php.net
一个使用自造PDO类的项目 - backwallkid
经过项目洗礼的PDO类 - backwallkid