首頁 > 後端開發 > php教程 > easyswoole 啟動TableManager+Cache工具的原理

easyswoole 啟動TableManager+Cache工具的原理

little bottle
發布: 2023-04-06 11:52:01
轉載
3132 人瀏覽過

本篇文章的主要內容是講述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,[
        &#39;data&#39;=>[
            &#39;type&#39;=>Table::TYPE_STRING,
            &#39;size&#39;=>10*1024
        ],
        &#39;microTime&#39;=>[
            &#39;type&#39;=>Table::TYPE_STRING,
            &#39;size&#39;=>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(&#39;set&#39;);
    $msg->setArg(&#39;key&#39;,$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工具的原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:cnblogs.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板