The main content of this article is to describe the easyswoole code to understand how to start TableManager and the principle of the Cache tool. It has certain reference value and interested friends must understand it.
EasySwoole is a memory-resident PHP framework developed based on Swoole Server. It is designed for APIs and gets rid of the performance loss caused by traditional PHP operating mode in process arousal and file loading. EasySwoole highly encapsulates Swoole Server while still maintaining the original features of Swoole Server. It supports simultaneous monitoring of HTTP, customized TCP, and UDP protocols, allowing developers to write multi-process, asynchronous, and highly available applications with the lowest learning cost and effort. Serve.
swoole_table is an ultra-high-performance, concurrent data structure based on shared memory and locks. Used to solve multi-process/multi-thread data sharing and synchronous locking problems.
TableManager mainly does the following things
add method
If there is this table name in the $list array ($name is a table name or collection name), initialize swoole_table, and then configure Create an array of field types
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 method
Directly returns an instance of swoole_table.
There are many places to use it
As mentioned above, when the system sets the Cache component Cache::getInstance()
the construction method does the following things
$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 is also a very important concept. In fact, it is a tool for managing task mapping.
Here you can see ProcessManager::getInstance()->addProcess($this->generateProcessName($i),CacheProcess::class)
In fact, here is passed ProcessManager allows the swoole service to add a process. swoole's addProcess method, document link https://wiki.swoole.com/wiki/page/390.html
Let's briefly explain the set method of Cache in advance to deepen the concept.
//讲解一下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和它的相关作用. }
Related tutorials: PHP video tutorial
The above is the detailed content of The principle of easyswoole starting TableManager+Cache tool. For more information, please follow other related articles on the PHP Chinese website!