国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Swoft 源碼剖析 - 代碼自動更新機制

iflove / 3014人閱讀

摘要:作者鏈接來源簡書著作權歸作者所有,本文已獲得作者授權轉載,并對原文進行了重新的排版。文件重載管理進程注冊了一個名為的該進程會在系統引導的最后一個階段,即啟動前啟動。

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/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元查看
<