php共享内存实现

http://blog.csdn.net/wzllai/article/details/8267074

接着上上篇博客http://blog.csdn.net/wzllai/article/details/8231974 里面的问题,如何避免每次请求都包含文件。自己写扩展对当前业务来说解决显然有点小题大做,在php中其实可以用共享内存来解决这个问题。

        共享内存是一种最为高效的进程间通信(IPC)方式,进程可以直接读写内存,而不需要任何数据的拷贝。php源码扩展中有个与共享内存相关的扩展。一个是shmop扩展,默认没有安装,在编译php时候需要--enable-shmop,该扩展在*nix和window 2000下都可以用,另外一个sysvshm是System V IPC函数的封装,只能在*nix下用,需要用时候在编译php的时候需要开启--enable-sysvmsg



    用sysvshm函数写一个简单的列子用共享内存读取一个300k大小的文件:

[html]  view plain copy
  1. define("UMASK", 0644);  
  2. $size = 310000;  
  3. $key = ftok(__FILE__,  'P');  
  4. if (false == ($sh = shm_attach($key, $size, UMASK)))  
  5.     die("shm open error");  
  6. $ret = @shm_get_var($sh, 1);  
  7. if (!$ret) {  
  8.     $str = file_get_contents("file");  
  9.     shm_put_var($sh, 1, $str);  
  10.     $ret = shm_get_var($sh, 1);  
  11. }  
  12. //deal $ret  
  13. ...  

通过ab测试同样条件下直接用file_get_contents(“file”)比,在文件比较小的情况下用共享内存貌似还没有直接读取文件效率高,当文件变大的时候共享内存的优势才能体现出来。一般严谨的情况下,在多进程下向共享内存存入数据的时候需要引入引入互斥机制,需要Semaphore系列下的sysvsem模块或者文件锁配合,使用信号或者文件锁来实现写入锁定。

[php]  view plain copy
  1. define("UMASK", 0644);  
  2. $size = 310000;  
  3. $key = ftok(__FILE__,  'P');  
  4. if (false == ($sh = shm_attach($key$size, UMASK)))  
  5.     die("shm open error");  
  6. $ret = @shm_get_var($sh, 1);  
  7. if (!$ret) {  
  8.     $str = file_get_contents("file");  
  9.     $skey = ftok(__FILE__,  's');  
  10.     $semid=sem_get($skey);   
  11.     sem_acquire($semid);  
  12.     shm_put_var($sh, 1, $str);  
  13.     sem_release($semid);  
  14.     $ret = shem_get_Var($sh, 1);  
  15.       
  16.     //使用文件锁解决并发互斥  
  17.     //$fp = fopen("file.lock", "w+")  
  18.     //if (flock($fp, LOCK_EX|LOCK_NB)) {  
  19.     //  shm_put_var($sh, 1, $str);  
  20.     //  fclose($fp)  
  21.     //} else {  
  22.     //  $ret = $str;  
  23.     //}  
  24. }  
  25. //deal $ret  
  26. ...  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值