当前位置: 首页 > Linux

php操作共享内存shmop类及简单使用测试(代码)

时间:2023-04-06 02:20:11 Linux

SimpleSHM是PHP操作共享内存的一个更小的抽象层,支持以面向对象的方式轻松操作内存段。在编写使用共享内存进行存储的小型应用程序时,该库有助于创建非常干净的代码。有3种方法可供处理:读取、写入和删除。只需从此类中实例化一个对象即可控制打开的共享内存段。类对象和测试代码id=$this->generateID();}else{$this->id=$id;}if($this->exists($this->id)){$this->shmid=shmop_open($this->id,"w",0,0);}}/***为共享内存块生成一个随机ID**@accessprotected*@returnint从路径名和项目标识符生成的SystemVIPC密钥*/protectedfunctiongenerateID(){$id=ftok(__FILE__,“b”);返回$id;/***检查是否存在具有提供的id的共享内存块**为了检查共享内存是否存在,我们必须以*读取权限打开它。如果它不存在,将发出警告,因此我们*使用@运算符抑制那些警告。**@accesspublic*@paramstring$id要检查的共享内存块的ID*@returnboolean如果块存在则为真,如果不存在则为假*/publicfunctionexists($id){$status=@shmop_open($id,"a",0,0);返回$状态;/***写入共享内存块**首先我们检查块是否存在,如果不存在,我们将创建它。现在,如果*块已经存在,我们需要删除它并使用新的字节分配重新创建它*与我们要写入的数据大小相匹配。我们标记为删除,关闭信号量*并重新创建它。**@accesspublic*@paramstring$data你不想写入共享内存块的数据*/publicfunctionwrite($data){$size=mb_strlen($data,'UTF-8');如果($this->exists($this->id)){shmop_delete($this->shmid);shmop_close($this->shmid);$this->shmid=shmop_open($this->id,"c",$this->perms,$size);shmop_write($this->shmid,$data,0);}else{$this->shmid=shmop_open($this->id,"c",$this->perms,$size);shmop_write($this->shmid,$data,0);}}/***从共享内存块读取**@accesspublic*@returnstring从共享内存块读取的数据*/publicfunctionread(){$size=shmop_size($this->shmid);$data=shmop_read($this->shmid,0,$size);返回$数据;}/***标记要删除的共享内存块**@accesspublic*/publicfunctiondelete(){shmop_delete($this->shmid);}/***获取当前共享内存块id**@accesspublic*/publicfunctiongetId(){return$this->id;}/***获取当前共享内存块权限**@accesspublic*/publicfunctiongetPermissions(){return$this->perms;}/***设置将使用的默认权限(八进制)在创建的内存块中**@accesspublic*@paramstring$perms权限,八进制形式*/publicfunctionsetPermissions($perms){$this->perms=$perms;}/***关闭共享内存块并停止操作**@accesspublic*/publicfunction__destruct(){shmop_close($this->shmid);}}assertInstanceOf('Simple\\SHM\\Block',$memory);$memory->write('样本');$data=$memory->read();$this->assertEquals('样本',$data);}publicfunctiontestIsCreatingNewBlockWithId(){$memory=newBlock(897);$this->assertInstanceOf('Simple\\SHM\\Block',$memory);$this->assertEquals(897,$memory->getId());$memory->write('样本2');$data=$memory->read();$this->assertEquals('样本2',$data);}publicfunctiontestIsMarkingBlockForDeletion(){$memory=newBlock(897);$内存->删除();$data=$memory->read();$this->assertEquals('样本2',$data);}publicfunctiontestIsPersistingNewBlockWithoutId(){$memory=newBlock;$this->assertInstanceOf('Simple\\SHM\\Block',$memory);$memory->write('样本3');取消设置($内存);$memory=新块;$data=$memory->read();$this->assertEquals('样本3',$data);}}附加说明write('Sample');echo$memory->read();?>请注意上面的代码没有为这个类传递一个ID。如果没有传递ID,它会随机选择一个数字,并用这个数字打开一个新的内存段。我们可以传入一个数字作为参数,让构造函数打开一个已有的内存段,或者创建一个特定ID的内存段,如下write('Sample');echo$new->read();?>魔术方法__destructor负责在内存段上调用??shmop_close以取消设置要从内存段分离的对象。我们称之为“SimpleSHM101”。现在让我们将此方法用于更高级的用途:使用共享内存作为存储。存储数据集需要序列化,因为数组或对象不能存储在内存中。虽然此处使用JSON进行序列化,但任何其他方法(例如XML或内置的PHP序列化)都可以满足要求。如下'John','password'=>'123456','posts'=>array('MynameisJohn','MynameisnotJohn'));$data=json_encode($results);$内存=新的SimpleSHM;$内存->写入($数据);$storedarray=json_decode($memory->read());print_r($storedarray);?>我们成功地将数组序列化为JSON字符串,将其存储在共享内存块中,从中读取数据,反序列化JSON字符串,并显示存储的数组。这可能看起来很简单,但想象一下这个代码片段打开的可能性。您可以使用它来存储Web服务请求、数据库查询甚至模板引擎缓存的结果。在内存中读取和写入将导致比读取和写入磁盘更高的性能。使用这种存储技术不仅对缓存有用,而且对应用程序之间的数据交换也很有用,只要数据以两端可读的格式存储即可。不要低估Web应用程序中共享内存的力量。这种存储可以通过许多不同的方式巧妙地实现,唯一的限制是开发人员的创造力和技能。