您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關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和它的相關作用. }
感謝各位的閱讀!關于easyswoole啟動TableManager+Cache工具的原理是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。