美文网首页PHP高级技能php面试题
基于swoole的php源码包升级原理实现

基于swoole的php源码包升级原理实现

作者: 焚_44b3 | 来源:发表于2018-12-11 20:25 被阅读52次

    场景:假设一个员工管理系统项目有如下功能

    • 员工考勤管理
    • 员工请假管理
    • 薪资查询
    • 员工报表统计
    • 合同管理

    项目的要求很简单,也很现实:第一个版本只要员工考勤和员工请假管理,出来后立即发布。当很多企业下载了该版本的员工管理系统,发现功能不齐,要求系统应该增加后面的功能。于是就有了版本升级。

    当有新的版本(含了新功能薪资查询,报表统计等)如何才能做好版本的升级呢?

    这里推荐用户一键升级的方式来升级项目,操作简单,就像桌面软件一样,发现有新的版本,点击更新,不用做任何操作就会升级到最新版本。

    如何实现一键升级?

    这里推荐swoole搭建一个websocket服务,来实现前端交互。整体设计流程如下图所示:


    升级流程
    主要文件如下:

    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

    相关文章

      网友评论

        本文标题:基于swoole的php源码包升级原理实现

        本文链接:https://www.haomeiwen.com/subject/wsiehqtx.html