溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

easyswoole啟動(dòng)TableManager+Cache工具的原理是什么

發(fā)布時(shí)間:2020-11-03 13:40:26 來(lái)源:億速云 閱讀:144 作者:小新 欄目:編程語(yǔ)言

這篇文章給大家分享的是有關(guān)easyswoole啟動(dòng)TableManager+Cache工具的原理是什么的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧。

EasySwoole 是一款基于Swoole Server 開(kāi)發(fā)的常駐內(nèi)存型PHP框架,專(zhuān)為API而生,擺脫傳統(tǒng)PHP運(yùn)行模式在進(jìn)程喚起和文件加載上帶來(lái)的性能損失。EasySwoole 高度封裝了Swoole Server 而依舊維持Swoole Server 原有特性,支持同時(shí)混合監(jiān)聽(tīng)HTTP、自定義TCP、UDP協(xié)議,讓開(kāi)發(fā)者以最低的學(xué)習(xí)成本和精力編寫(xiě)出多進(jìn)程,可異步,高可用的應(yīng)用服務(wù)。

swoole_table一個(gè)基于共享內(nèi)存和鎖實(shí)現(xiàn)的超高性能,并發(fā)數(shù)據(jù)結(jié)構(gòu)。用于解決多進(jìn)程/多線程數(shù)據(jù)共享和同步加鎖問(wèn)題。

TableManager主要做了下面幾件事
add方法
如果$list數(shù)組中有這個(gè)表名($name是一個(gè)表名或者叫做集合名),就初始化swoole_table,然后配置的字段類(lèi)型數(shù)組進(jìn)行創(chuàng)建

if(!isset($this->list[$name])){
    $table = new Table($size);
    foreach ($columns as $column => $item){
        $table->column($column,$item['type'],$item['size']);
    }
    $table->create();
    $this->list[$name] = $table;
}

get方法
   直接返回swoole_table的實(shí)例。

使用的地方有很多
前文提到的在系統(tǒng)設(shè)置Cache組件 Cache::getInstance()的時(shí)候

構(gòu)造方法做了如下事情

$num = intval(Config::getInstance()->getConf("EASY_CACHE.PROCESS_NUM"));//Config默認(rèn)配置是1,如果配置為小于等于0則不開(kāi)啟Cache
if($num <= 0){
   return;
}
$this->cliTemp = new SplArray();
//若是在主服務(wù)創(chuàng)建,而非單元測(cè)試調(diào)用
if(ServerManager::getInstance()->getServer()){
    //創(chuàng)建table用于數(shù)據(jù)傳遞
    TableManager::getInstance()->add(self::EXCHANGE_TABLE_NAME,[
        'data'=>[
            'type'=>Table::TYPE_STRING,
            'size'=>10*1024
        ],
        'microTime'=>[
            'type'=>Table::TYPE_STRING,
            'size'=>15
        ]
    ],2048);
    //創(chuàng)建了一個(gè)__Cache的swoole_table表,字段為 data String 10240,microTime String 15的表
    $this->processNum = $num;
    for ($i=0;$i < $num;$i++){
        ProcessManager::getInstance()->addProcess($this->generateProcessName($i),CacheProcess::class);
    }
}

ProcessManager也是一個(gè)很重要的概念。其實(shí)就是一個(gè)管理任務(wù)映射的工具。

這里可以看到ProcessManager::getInstance()->addProcess($this->generateProcessName($i),CacheProcess::class)

其實(shí)這里是通過(guò)ProcessManager,讓swoole服務(wù)添加了一個(gè)進(jìn)程。swoole的addProcess方法,文檔鏈接https://wiki.swoole.com/wiki/page/390.html

easyswoole啟動(dòng)TableManager+Cache工具的原理是什么

提前略帶講解一下Cache的set方法加深概念

//講解一下Cache的set方法加深概念
if(!ServerManager::getInstance()->isStart()){//兼容測(cè)試模式。也就是不開(kāi)啟服務(wù)的情景下直接是clitemp中取緩存數(shù)據(jù)
    $this->cliTemp->set($key,$data);
}
if(ServerManager::getInstance()->getServer()){
    $num = $this->keyToProcessNum($key);//這里是通過(guò)key然后hash到應(yīng)該投放的Cache進(jìn)程中去。
    $msg = new Msg();
    $msg->setCommand('set');
    $msg->setArg('key',$key);
    $msg->setData($data);
    //下面一句話還是挺復(fù)雜的,根據(jù)key名hash到ProcessManager對(duì)應(yīng)的映射,然后獲取到swoole_process的實(shí)例,以swoole的write函數(shù)向管道內(nèi)寫(xiě)入數(shù)據(jù)。
    ProcessManager::getInstance()->getProcessByName($this->generateProcessName($num))->getProcess()->write(\swoole_serialize::pack($msg));
    //在寫(xiě)完數(shù)據(jù)后,在CacheProcess的onReceive方法中可以看到對(duì)應(yīng)setCommand的操作細(xì)節(jié)。其實(shí)數(shù)據(jù)都被寫(xiě)到了一個(gè)Arr數(shù)組中。下篇接著講一下Cache的實(shí)現(xiàn)細(xì)節(jié)。這節(jié)還是主要講TableManager和它的相關(guān)作用.
}

感謝各位的閱讀!關(guān)于easyswoole啟動(dòng)TableManager+Cache工具的原理是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI