时间:2016-10-17来源:本站原创作者:佚名

简单的说明

可能很少情况会使用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;

}

$







































北京中医治疗白癜风医院
北京中医治疗白癜风医院

转载请注明原文网址:http://www.coolofsoul.com/phptx/11955.html

------分隔线----------------------------