注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

phperwuhan的博客

记载一个phper的历程!phperwuhan.blog.163.com

 
 
 

日志

 
 

php共享内存的使用  

2010-06-13 17:31:32|  分类: php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

来源:http://mydraft.cn/posts/48

php有两套使用共享内存的函数,一套是System V IPC函数的封装,另一套是shmop。这两个都无需安装外部库文件。前者只能在linux下使用,而且要使用它的话,在安装php的时候要加上–enable-sysvshm选项;而后者在linux和windows(win2k之后的系统,win98不支持)都可以使用,但在windows的时候,只有在php是ISAPI运行模式才能正常工作,在安装php的时候要加上–enable-shmop。

这两套函数的使用相当简单,下面分别给出简单的用法,更详细的信息可以参考php手册。

System V的共享内存使用:

  1. <?php   
  2. $key = 12345; // 共享内存的key   
  3. $memsize = 100; // 共享内存的大小,单位byte   
  4. $perm = 0666; // 共享内存访问权限,参考linux的权限   
  5. $var_key = 345; // 共享内存的某变量的key   
  6. $shmid = shm_attach( $key$memsize$perm ); // 创建一个共享内存   
  7. shm_put_var( $shmid$var_key"abc" ); // 插入一个共享内存变量,key为$var_key,值为"abc"   
  8. shm_detach( $shmid ); // 关闭共享内存   
  9. ?>  
<?php  $key = 12345; // 共享内存的key  $memsize = 100; // 共享内存的大小,单位byte  $perm = 0666; // 共享内存访问权限,参考linux的权限  $var_key = 345; // 共享内存的某变量的key  $shmid = shm_attach( $key, $memsize, $perm ); // 创建一个共享内存  shm_put_var( $shmid, $var_key, "abc" ); // 插入一个共享内存变量,key为$var_key,值为"abc"  shm_detach( $shmid ); // 关闭共享内存  ?>  

运行上面的php程序将创建一个key为12345的共享内存,大小为100字节,里面有个值为”abc”的变量。我们可以在linux命令行敲入ipcs看看我们所创建的共享内存:

—— Shared Memory Segments ——–
key            shmid        owner         perms        bytes        nattch       status
0×00003039     262144       daemon         666          100             0

0×00003039就是12345的16进制形式。我们再写另一个访问这个共享内存并删除这个共享内存的php:

  1. <?php   
  2. $shmid = shm_attach( 12345 ); // 访问key为12345的共享内存   
  3. echo shm_get_var( $shmid, 345 ); // 把共享内存中key为345的变量打印出来,这里将显示abc   
  4. shm_remove( $shmid ); // 删除该共享内存   
  5. ?>  
<?php  $shmid = shm_attach( 12345 ); // 访问key为12345的共享内存  echo shm_get_var( $shmid, 345 ); // 把共享内存中key为345的变量打印出来,这里将显示abc  shm_remove( $shmid ); // 删除该共享内存  ?>  

运行这个php,将显示abc,并把共享内存删除,这时候再运行ipcs就可以看到那块共享内存已经不存在了。

shmop的共享内存使用:

  1. <?php   
  2. $key = 12345; // 共享内存的key   
  3. $memsize = 100; // 共享内存的大小,单位byte   
  4. $perm = 0666; // 共享内存访问权限,参考linux的权限   
  5. $offset = 0; // 共享内存偏移地址,0表示共享内存的起始地址   
  6. $shmid = shmop_open($key"c"$perm$memsize); // 创建一个共享内存,第二个参数c表示创建   
  7. $shm_bytes_written = shmop_write($shm_id"abc", 0); // 把"abc"写入共享内存   
  8. echo $shm_bytes_written// 打印出写入共享内存的数据长度,这里将显示3   
  9. shmop_close($shm_id); // 关闭共享内存   
  10. ?>  
<?php  $key = 12345; // 共享内存的key  $memsize = 100; // 共享内存的大小,单位byte  $perm = 0666; // 共享内存访问权限,参考linux的权限  $offset = 0; // 共享内存偏移地址,0表示共享内存的起始地址  $shmid = shmop_open($key, "c", $perm, $memsize); // 创建一个共享内存,第二个参数c表示创建  $shm_bytes_written = shmop_write($shm_id, "abc", 0); // 把"abc"写入共享内存  echo $shm_bytes_written; // 打印出写入共享内存的数据长度,这里将显示3  shmop_close($shm_id); // 关闭共享内存  ?>  

运行这个php将创建一个key为12345,大小为100字节的共享内存,里面写入了”abc”这个字符串。我们在写一个访问这个共享内存的php:

  1. <?php   
  2. $shm_id = shmop_open(12345, "w", 0, 0); // 打开key为12345的共享内存,第二个参数w表示以读写方式打开,打开已存在的共享内存,第三个和第四个参数必须是0   
  3. $shm_data = shmop_read($shm_id, 0, 3); // 从共享内存里面读取3字节的数据,第二个参数是偏移地址,0表示共享内存的起始地址   
  4. echo $shm_data// 打印出上个函数返回的共享内存数据   
  5. shmop_delete($shm_id); // 删除共享内存   
  6. ?>  
<?php  $shm_id = shmop_open(12345, "w", 0, 0); // 打开key为12345的共享内存,第二个参数w表示以读写方式打开,打开已存在的共享内存,第三个和第四个参数必须是0  $shm_data = shmop_read($shm_id, 0, 3); // 从共享内存里面读取3字节的数据,第二个参数是偏移地址,0表示共享内存的起始地址  echo $shm_data; // 打印出上个函数返回的共享内存数据  shmop_delete($shm_id); // 删除共享内存  ?>  

运行这个php将打印出abc,并把原来的共享内存删除。

总结:

这两套函数都是简单易用的,shmop的唯一好处是可以在windows下使用,在linux下的话本人强烈推荐使用shm_*那套函数,因为那套函数在插入、更新以及读取共享内存里面的变量相当方便,而shmop需要自己来规划共享内存的存储结构,应用起来稍微复杂一点。此外,上面的例子里面我直接用数字12345作为共享内存的key,实际上,更为标准的做法是使用ftok函数来把一个路径转成ipc的key。具体做法可以参考php手册。

  评论这张
 
阅读(677)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017