当前位置: 首页 > news >正文

Swoft 源码剖析 - 代码自动更新机制

作者:bromine
链接:https://www.jianshu.com/p/e63...
來源:简书
著作权归作者所有,本文已获得作者授权转载,并对原文进行了重新的排版。
Swoft Github: https://github.com/swoft-clou...

前言

不同于PHP-FPM每次请求都会加载一次PHP代码,常驻型应用只会读取一次源文件,为了避免每次发布/调试代码都需要手动重启Swoft应用,Swoft提供了自动重载代码的功能。

文件重载管理进程

Swoft注册了一个名为reload的Process,该进程会在系统引导的最后一个阶段,即Swoole启动前启动。该Process会启动名为reload的Bean

//Swoft\Process\Bootstrap\Process\ReloadProcess.php
/**
 * Relaod process
 *
 * @Process(name="reload", boot=true)
 */
class ReloadProcess implements ProcessInterface
{
    /**
     * @param \Swoft\Process\Process $process
     */
    public function run(SwoftProcess $process)
    {
        $pname = App::$server->getPname();
        $processName = sprintf('%s reload process', $pname);
        $process->name($processName);

        /* @var \Swoft\Process\Bootstrap\Reload $relaod */
        $relaod = App::getBean(Reload::class);
        $relaod->run();
    }
    //.....
}

文件更新监听Bean

//\Swoft\Process\Bootstrap\Reload::class
/**
 *  @Bean()
 */
class Reload
{
    //code .....

    /**
     * 启动监听
     */
    public function run()
    {
        $server = App::$server;
        while (true) {
            sleep($this->interval);
            //FileHelper::md5File()负责递归的计算文件夹的md5,其实改名为FileHelper::md5Dir()更合适,因为他不接受非目录的文件作为参数
            $md5File = FileHelper::md5File($this->watchDir);//$this->watchDir固定为@app别名对应的文件夹
            if (strcmp($this->md5File, $md5File) !== 0) {
                echo "Start reloading...\n";
                $server->isRunning();
                //md5和上次不一致就通知swoole重启服务
                $server->getServer()->reload();
                echo "Reloaded\n";
            }
            $this->md5File = $md5File;
        }
    }
}

代码自动重载的机制也很简单,每间隔几秒递归的计算@app目录下所有php文件的哈希值,发现文件夹的md5和之前的值有差别则通知Swoole重启worker进程。

Swoole WorkerStart事件

Swoole会通知各个worker重启,触发Swoole事件WorkerStart,具体的回调事件如下

namespace Swoft\Bootstrap\Server\ServerTrait.php;

/**
 * OnWorkerStart event callback
 *
 * @param Server $server server
 * @param int $workerId workerId
 * @throws \InvalidArgumentException
 */
public function onWorkerStart(Server $server, int $workerId)
{
    // Init Worker and TaskWorker
    $setting = $server->setting;
    $isWorker = false;

    if ($workerId >= $setting['worker_num']) {
        // TaskWorker
        ApplicationContext::setContext(ApplicationContext::TASK);
        ProcessHelper::setProcessTitle($this->serverSetting['pname'] . ' task process');
    } else {
        // Worker
        $isWorker = true;
        ApplicationContext::setContext(ApplicationContext::WORKER);
        ProcessHelper::setProcessTitle($this->serverSetting['pname'] . ' worker process');
    }
    //触发一个Swoft服务事件```SwooleEvent::ON_START```,其监听者使用@ServerListener(event=SwooleEvent::ON_START)声明
    $this->fireServerEvent(SwooleEvent::ON_WORKER_START, [$server, $workerId, $isWorker]);
    //主要是重新扫描加载注解和Bean的重载
    $this->beforeWorkerStart($server, $workerId, $isWorker);
}
Swoft源码剖析系列目录: https://segmentfault.com/a/11...

相关文章:

  • 深度学习(五)基于tensorflow实现简单卷积神经网络Lenet5
  • 移动端开发干货
  • Qcon 演讲纪实:详解如何在实时视频通话中实现AR功能
  • 大咖 | 卡耐基梅隆教授Tom Mitchell:人工智能在中国前景光明,有2点要注意
  • 注释那些事儿:前端代码质量系列文章(一)
  • 专访腾讯云沙开波:从无到有,打造全球领先调度系统
  • 巨杉数据库:金融级数据库未来方向
  • Python之md5.update才过的哪些坑
  • IIS7/7.5/8如何实现访问HTTP跳转到HTTPS访问
  • overflow问题--滚动设置?
  • Apache Curator操作zookeeper的API使用
  • AutoEx应用崩溃自动匹配Stack Overflow的解答
  • Hessian入门
  • node常用模块---path
  • JPA的配置文件
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • CSS中外联样式表代表的含义
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • Java编程基础24——递归练习
  • java多线程
  • Just for fun——迅速写完快速排序
  • Laravel 中的一个后期静态绑定
  • Selenium实战教程系列(二)---元素定位
  • Spark RDD学习: aggregate函数
  • Vue UI框架库开发介绍
  • vuex 学习笔记 01
  • 百度小程序遇到的问题
  • 巧用 TypeScript (一)
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 移动端 h5开发相关内容总结(三)
  • 鱼骨图 - 如何绘制?
  • 终端用户监控:真实用户监控还是模拟监控?
  • 自制字幕遮挡器
  • AI算硅基生命吗,为什么?
  • 积累各种好的链接
  • 选择阿里云数据库HBase版十大理由
  • ​卜东波研究员:高观点下的少儿计算思维
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (4) PIVOT 和 UPIVOT 的使用
  • (vue)页面文件上传获取:action地址
  • (七)理解angular中的module和injector,即依赖注入
  • (四) Graphivz 颜色选择
  • (转)h264中avc和flv数据的解析
  • ***详解账号泄露:全球约1亿用户已泄露
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 8.0 中有哪些新的变化?
  • .net core 控制台应用程序读取配置文件app.config
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET 中让 Task 支持带超时的异步等待
  • .net2005怎么读string形的xml,不是xml文件。
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [100天算法】-实现 strStr()(day 52)
  • [APIO2012] 派遣 dispatching
  • [AS3]URLLoader+URLRequest+JPGEncoder实现BitmapData图片数据保存