基于swoole的php源码包升级原理实现
场景:假设一个员工管理系统项目有如下功能
- 员工考勤管理
- 员工请假管理
- 薪资查询
- 员工报表统计
- 合同管理
项目的要求很简单,也很现实:第一个版本只要员工考勤和员工请假管理,出来后立即发布。当很多企业下载了该版本的员工管理系统,发现功能不齐,要求系统应该增加后面的功能。于是就有了版本升级。
当有新的版本(含了新功能薪资查询,报表统计等)如何才能做好版本的升级呢?
这里推荐用户一键升级的方式来升级项目,操作简单,就像桌面软件一样,发现有新的版本,点击更新,不用做任何操作就会升级到最新版本。
如何实现一键升级?
这里推荐swoole搭建一个websocket服务,来实现前端交互。整体设计流程如下图所示:
![](https://img.haomeiwen.com/i7266818/42ae65851bc4b613.png)
主要文件如下:
version(文件)
db/(数据库目录)
db/userdb.sql(上传过程中产生的备份的用户数据)
upgrade.php (当前项目主升级文件)
...//其他项目文件
down/db/sys.sql (最新数据库结构,以及系统数据文件)
down/upgrade.php (上传包解压后的主升级文件)
down/(升级,上传压缩文件目录)
down/version
down/.. 其他文件
主要流程:
- 上传压缩文件:将远程包下载到本地,点击上传(这里采用ajax异步上传)
- 解压缩:将上传的压缩包解压到 down目录下。
- 检验文件合法性:避免上传的非法文件,或者非项目的压缩包,导致整个项目瘫痪。
- 校验版本:如果要升级的版本大于当前项目版本,方可升级。
- 覆盖项目文件:将down解压下的所有文件覆盖原项目下的文件。
- 热重启:这一步很重要。swoole 热重启的方法为:$server->reload(); 后面会介绍为什么需要热重启!
- 备份用户数据,删除原数据表:表分用户表和数据表,后面做详细介绍。
- 导入最新表:将最新的表结构和系统数据导入到数据库,并且将上一步导入的用户数据表导入到数据库。完成数据库的升级和恢复
- 更改版本号 将down/version替换项目下version文件
- 升级完成!
更好的升级办法
上传压缩包可以做成到云上自动下载。这样可以实现真正的一键升级,也可以避免因为上传错压缩包导致系统瘫痪的风向。
为什么要热重启?
也许,之前的upgrade.php文件并不完善,但是每次我们项目的upgrade.php文件是通过swoole运行在内存中,只要进程不断开,替换或者删除项目下的upgrade.php文件,原来的upgrade.php依旧正常运行。当upgrade.php升级逻辑做了改变的时候,怎样才能实现运行的是上传上去新版本的upgrade.php呢?
swoole官网提供了热重启功能。当热重启完成后,再次进入websocket接口,运行的便是最新上传的升级文件。
用户数据和系统数据
用户数据指的是用户产生的数据,比如该项目中的用户信息。系统数据指的是系统控制的数据,比如所有的员工类型。
升级数据库最好的办法就是 将数据表结构和系统数据升级到最新,然后导入原来的用户数据。
文档结束!
不懂可以加qq:1186969412 qq群:536633782
官网:http://uminicmf.com/
php在线面试题集:http://cainiaophp.com/
php面试讨论群:536633782