资讯专栏INFORMATION COLUMN

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

iflove / 2979人阅读

摘要:作者链接來源简书著作权归作者所有,本文已获得作者授权转载,并对原文进行了重新的排版。文件重载管理进程注册了一个名为的该进程会在系统引导的最后一个阶段,即启动前启动。

作者: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

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

        /* @var SwoftProcessBootstrapReload $relaod */
        $relaod = App::getBean(Reload::class);
        $relaod->run();
    }
    //.....
}
文件更新监听Bean
//SwoftProcessBootstrapReload::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...
";
                $server->isRunning();
                //md5和上次不一致就通知swoole重启服务
                $server->getServer()->reload();
                echo "Reloaded
";
            }
            $this->md5File = $md5File;
        }
    }
}

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

Swoole WorkerStart事件

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

namespace SwoftBootstrapServerServerTrait.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...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28693.html

相关文章

  • Swoft 源码剖析 - 目录

    摘要:作者链接來源简书著作权归作者所有,本文已获得作者授权转载,并对原文进行了重新的排版。同时顺手整理个人对源码的相关理解,希望能够稍微填补学习领域的空白。系列文章只会节选关键代码辅以思路讲解,请自行配合源码阅读。 作者:bromine链接:https://www.jianshu.com/p/2f6...來源:简书著作权归作者所有,本文已获得作者授权转载,并对原文进行了重新的排版。Swoft...

    qpwoeiru96 评论0 收藏0
  • Swoft 源码剖析 - Swoole和Swoft的那些事 (Http/Rpc服务篇)

    摘要:和服务关系最密切的进程是中的进程组,绝大部分业务处理都在该进程中进行。随后触发一个事件各组件通过该事件进行配置文件加载路由注册。事件每个请求到来时仅仅会触发事件。服务器生命周期和服务基本一致,详情参考源码剖析功能实现 作者:bromine链接:https://www.jianshu.com/p/4c0...來源:简书著作权归作者所有,本文已获得作者授权转载,并对原文进行了重新的排版。S...

    张汉庆 评论0 收藏0
  • Swoft 源码剖析 - Swoole和Swoft的那些事(Task投递/定时任务篇)

    摘要:作为定时任务的执行者,通过每唤醒自身一次,然后把执行表遍历一次,挑选当下需要执行的任务,通过投递出去并更新该任务执行表中的状态。 作者:bromine链接:https://www.jianshu.com/p/b44...來源:简书著作权归作者所有,本文已获得作者授权转载,并对原文进行了重新的排版。Swoft Github: https://github.com/swoft-clou.....

    vvpvvp 评论0 收藏0
  • Swoft 源码剖析 - Swoft 中的注解机制

    摘要:中的注解注解是里面很多重要功能特别是,容器的基础。主流的框架中使用的注解都是借用型注释块型注释中的定义自己的注解机制。在中是注解信息的最终装载容器。使用的信息构造实例或获取现有实例以上就是注解机制的整体实现了。源码剖析系列目录 作者:bromine链接:https://www.jianshu.com/p/ef7...來源:简书著作权归作者所有,本文已获得作者授权转载,并对原文进行了重新...

    zzbo 评论0 收藏0
  • Swoft 源码剖析 - 连接池

    摘要:基于扩展实现真正的数据库连接池这种方案中,项目占用的连接数仅仅为。一种是连接暂时不再使用,其占用状态解除,可以从使用者手中交回到空闲队列中这种我们称为连接的归队。源码剖析系列目录 作者:bromine链接:https://www.jianshu.com/p/1a7...來源:简书著作权归作者所有,本文已获得作者授权转载,并对原文进行了重新的排版。Swoft Github: https:...

    rozbo 评论0 收藏0

发表评论

0条评论

iflove

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<