php共享内存实现
来源:互联网 发布:许知远东方历史评论 编辑:程序博客网 时间:2024/05/17 08:34
接着上上篇博客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大小的文件:
define("UMASK", 0644);$size = 310000;$key = ftok(__FILE__, 'P');if (false == ($sh = shm_attach($key, $size, UMASK)))die("shm open error");$ret = @shm_get_var($sh, 1);if (!$ret) {$str = file_get_contents("file");shm_put_var($sh, 1, $str);$ret = shm_get_var($sh, 1);}//deal $ret...
通过ab测试同样条件下直接用file_get_contents(“file”)比,在文件比较小的情况下用共享内存貌似还没有直接读取文件效率高,当文件变大的时候共享内存的优势才能体现出来。一般严谨的情况下,在多进程下向共享内存存入数据的时候需要引入引入互斥机制,需要Semaphore系列下的sysvsem模块或者文件锁配合,使用信号或者文件锁来实现写入锁定。
define("UMASK", 0644);$size = 310000;$key = ftok(__FILE__, 'P');if (false == ($sh = shm_attach($key, $size, UMASK)))die("shm open error");$ret = @shm_get_var($sh, 1);if (!$ret) {$str = file_get_contents("file");$skey = ftok(__FILE__, 's');$semid=sem_get($skey); sem_acquire($semid);shm_put_var($sh, 1, $str);sem_release($semid);$ret = shem_get_Var($sh, 1);//使用文件锁解决并发互斥//$fp = fopen("file.lock", "w+")//if (flock($fp, LOCK_EX|LOCK_NB)) {//shm_put_var($sh, 1, $str);//fclose($fp)//} else {//$ret = $str;//}}//deal $ret...
- php共享内存实现
- php共享内存实现
- PHP共享内存实现的消息队列
- php共享内存使用
- PHP共享内存
- php共享内存使用
- PHP共享内存段
- PHP共享内存
- php 信号量(共享内存)
- nginx共享内存:共享内存的实现
- java实现共享内存
- VC 实现共享内存
- 共享内存实现原理
- 共享内存实现
- 共享内存实现原理
- 实现共享内存
- 共享内存的实现
- PHP直接操作共享内存中的数据实现与其他应用程序共享信息
- GCD的C实现--Euclid算法
- 忙碌中……
- 黑马程序员——Lock锁与Condition
- 日志组件logback的介绍及配置使用方法
- C#如何在 Catch 块中使用特定异常
- php共享内存实现
- 【转】Android Parcelable和Serializable的区别
- 二叉堆例程
- server版ubuntu时间设置
- 泛型类
- js不间断向上滚动
- 好玩的万年历
- js中addEventListener和attachEvent的用法(转)
- windows8开发-metro应用中页面渐入效果(透明度)