简单的说明 可能很少情况会使用PHP来操控共享内存,一方面在内存的控制上,MC已经提供了一套很好的方式,另一方面,自己来操控内存的难度较大,内存的读写与转存,包括后面可能会用到的存储策略,要是没有一定计算机组成原理的基础,想做这些不是一件容易的事情。那为什么还要使用它呢?如果我想进行管道通信,为其它的应用服务准备数据;我想建立自己的数据缓存体系,使用MC有点大炮打苍蝇的感觉。那么shmop会是一个选择,当然,在操作内存前,一定要谨慎。 系统要求 shmop系列函数只是在unix/Linux下可用,可以通过命令: Plain代码 ipcs-m 来查看当前的共享内存使用情况。其中,各个部分解释如下: key:共享内存的唯一的key值,共享内存通过该key来判断你读取的是哪一块内存。 shmid:当使用key来获取内存时,你获得的是这个id的值。它作为你操作内存块的标识。 owner:创建该共享内存块的用户 perms:该共享内存的读写权限,8禁止,可以是,与文件的读写权限一致。 bytes:该内存块的大小 nattch:连接该内存块的进程数 status:当前状态,如:dest,即将删除等。 使用示例 具体的使用说明,在PHP手册中有详细介绍,这里不进行赘述。这里将写一些简单的操作例子。 写入 Php代码 ?php /** *SHMOP共享内存操作示例 * authormonkee**/ $key=0xb; $size=; $shmid= shmop_open($key,c,,$size);if($shmid===FALSE){ exit(shmop_openerror!); } $data=世界,你好!我将写入很多的数据,你能罩得住么?; $length=shmop_write($shmid,pack(a*,$data),0); if($length===FALSE){ exit(shmop_writeerror!); } shmop_close($shmid);exit(succ); ? 读取 Php代码 ?php /** *SHMOP共享内存操作示例 * authormonkee**/ $key=0xb; $size=; $shmid= shmop_open($key,c,,$size);if($shmid===FALSE){ exit(shmop_openerror!); } $data=unpack(a*,shmop_read($shmid,0,)); if($data===FALSE){ exit(shmop_readerror!); } shmop_close($shmid);exit($data[1]); ? 这里使用到了函数:pack()这个函数用来将内存里的内容转化为二进制内容,具体请查看手册内容。 多服务器内存同步 已经在本地做好了这个服务,现在需要在多台服务器上进行内存数据同步。虽然这个时候可以放弃共享内存的方式来处理数据了,然而你被要求需要这么做。于是,同步我想不是问题,做好“主-从”的架构,我同步好的内存及时推送过去就可以了。然而,我是不是需要在从机上做一个监听程序呢?这样的代价有点大,好的一点是,从机上有apache。也就是说可以使用HTTP协议来进行通信了。 同步策略 如何同步?看似无聊的问题,却又产生了疑惑。同步数据呗,但是同步什么数据!一种方式是主机的内存改变后,程序读取所有内存数据然后发送到从机进行同步;如果我只是更改一些简单的操作位的话,那么小的更新却要引起整个内存块的同步,似乎有些浪费。还有一种,是更新变化。将变化进行更新。这种比较复杂,因为你需要定义每一种操作的处理。幸运的是,你需要操作的数据并不多,还有,你要定义的操作也不多:write,delete(read可以不要,因为你很少会从从机上读取数据)。那么好了,我们选择其中一种来做吧。 主机发送 Php代码 ?php /** *共享内存操作,支持远程内存同步。 * authorhufeng* since-08-10* */ define(PSHMOP_HOST,..0.1); define(PSHMOP_SEPE,\r\n----------CKSJFIOWKJDFOCKJVNBBSDF----------\r\n); classPshmop { staticprivate$data=array(); staticpublicfunctionwrite($key,$offset,$data,$size=0){ $h=array(key=$key,offset=$offset,size=$size,ac=write); returnself::add($h,$data); } staticpublicfunctiondel($key){ $h=array(key=$key,ac=delete); returnself::add($h); } staticprivatefunctionadd($dataheader,$databody=){ self::$data[]=serialize($dataheader).\n.$databody; } staticprivatefunctionsend(){ $d=self::$data; if(count($d)==0){ return; } $北京中医治疗白癜风医院北京中医治疗白癜风医院
|