easyswoole 啟動TableManager+Cache工具的原理

2020-07-16 10:05:31
本篇文章的主要內容是講述easyswoole程式碼來了解如何啟動TableManager,以及Cache工具的原理,具有一定的參考價值,感興趣的朋友一定要了解一下。

EasySwoole 是一款基於Swoole Server 開發的常駐記憶體型PHP框架,專為API而生,擺脫傳統PHP執行模式在進程喚起和檔案載入上帶來的效能損失。EasySwoole 高度封裝了Swoole Server 而依舊維持Swoole Server 原有特性,支援同時混合監聽HTTP、自定義TCP、UDP協定,讓開發者以最低的學習成本和精力編寫出多進程,可非同步,高可用的應用服務。

swoole_table一個基於共用記憶體和鎖實現的超高效能,並行資料結構。用於解決多進程/多執行緒資料共用和同步加鎖問題。

TableManager主要做了下面幾件事
add方法
如果$list陣列中有這個表名($name是一個表名或者叫做集合名),就初始化swoole_table,然後設定的欄位型別陣列進行建立

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的範例。

使用的地方有很多
前文提到的在系統設定Cache元件 Cache::getInstance()的時候

構造方法做了如下事情

$num = intval(Config::getInstance()->getConf("EASY_CACHE.PROCESS_NUM"));//Config預設設定是1,如果設定為小於等於0則不開啟Cache
if($num <= 0){
   return;
}
$this->cliTemp = new SplArray();
//若是在主服務建立,而非單元測試呼叫
if(ServerManager::getInstance()->getServer()){
    //建立table用於資料傳遞
    TableManager::getInstance()->add(self::EXCHANGE_TABLE_NAME,[
        'data'=>[
            'type'=>Table::TYPE_STRING,
            'size'=>10*1024
        ],
        'microTime'=>[
            'type'=>Table::TYPE_STRING,
            'size'=>15
        ]
    ],2048);
    //建立了一個__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也是一個很重要的概念。其實就是一個管理任務對映的工具。

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

其實這裡是通過ProcessManager,讓swoole服務新增了一個進程。swoole的addProcess方法,文件連結https://wiki.swoole.com/wiki/page/390.html

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

//講解一下Cache的set方法加深概念
if(!ServerManager::getInstance()->isStart()){//相容測試模式。也就是不開啟服務的情景下直接是clitemp中取快取資料
    $this->cliTemp->set($key,$data);
}
if(ServerManager::getInstance()->getServer()){
    $num = $this->keyToProcessNum($key);//這裡是通過key然後hash到應該投放的Cache進程中去。
    $msg = new Msg();
    $msg->setCommand('set');
    $msg->setArg('key',$key);
    $msg->setData($data);
    //下面一句話還是挺複雜的,根據key名hash到ProcessManager對應的對映,然後獲取到swoole_process的範例,以swoole的write函數向管道內寫入資料。
    ProcessManager::getInstance()->getProcessByName($this->generateProcessName($num))->getProcess()->write(swoole_serialize::pack($msg));
    //在寫完資料後,在CacheProcess的onReceive方法中可以看到對應setCommand的操作細節。其實資料都被寫到了一個Arr陣列中。下篇接著講一下Cache的實現細節。這節還是主要講TableManager和它的相關作用.
}

相關教學:PHP視訊教學

以上就是easyswoole 啟動TableManager+Cache工具的原理的詳細內容,更多請關注TW511.COM其它相關文章!