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其它相關文章!