php实现基于shmop扩展的数据缓存

http://eslizn.com/post/php-data-cache-for-shmop.html

今天上课时研究了下PHP的数据缓存,根据网上的资料,一般采用serialize序列化存储,读取时将数据通过unserialize将数据反序列化还原.

接着,缓存一般存储在文件或者内存中.在大型应用中,一般是将模板缓存和数据缓存分割开来的,而且是将模板缓存以文件的形式缓存,数据使用内存来缓存.这样的架构能在很大程度上减轻数据库和程序的压力.

关于php操作内存,我选择了shmop扩展,其方法只有6个:

  • shmop_open 打开内存块.
  • shmop_write 向内存块中写入数据
  • shmop_size 获得内存块大小
  • shmop_read 读取内存块数据
  • shmop_delete 删除内存块数据
  • shmop_close 关闭内存块
 
打开内存块使用shmop_open 成功返回shmid,失败返回false:
1
int shmop_open ( int $key , string $flags , int $mode , int $size )
参数$key是用来标识共享内存段的,一般使用ftok函数生成.
参数$flags是内存段属性:
  • a:只读内存段
  • c:读写内存段,如果内存段不存在则创建
  • w:读写内存段
  • n:创建一个新的内存段,如果已经存在则返回失败.
参数$mode是内存段访问权限,采用八进制数据,如0664
参数$size是内存段大小.
向内存段中写入数据shmop_write 成功返回写入数据大小,失败返回false:
1
int shmop_write ( int $shmid , string $data , int $offset )
参数$shmid是使用shmop_open返回的一个id.
参数$data是要写入的数据.
参数$offset是写入数据的偏移量.
从内存段中读取数据使用shmop_read 成功返回数据,失败返回false
1
string shmop_read ( int $shmid , int $start , int $count )
参数$shmid是使用shmop_open返回的一个id.
参数$start是要读取数据在内存段中的起始位置.
参数$count是要读取的数据长度.
获取内存段的数据大小使用shmop_size 返回数据长度
1
int shmop_size ( int $shmid )
参数$shmid是使用shmop_open返回的一个id.
删除内存段使用shmop_delete 成功返回true,失败返回false
1
bool shmop_delete ( int $shmid )
参数$shmid是使用shmop_open返回的一个id.
关闭内存段使用shmop_close
1
void shmop_close ( int $shmid )
参数$shmid是使用shmop_open返回的一个id.
 
/*
  *  Memcache 内存缓存模块
  *          init()          初始化
  *      get($key)       获取数据
  *      set($key,$val)      存储数据
  *      del($key)       删除数据
  *      close()         关闭内存段
  *  Author Eslizn http://eslizn.com  at 2011-12-17
*/
 
class Memcache
{
     public static $list = array ();
 
     public static function init()
     {
         //Memcache::close();
     }
 
     public static function get( $key )
     {
         if (isset(Memcache:: $list [ $key ]))
         {
             return unserialize(shmop_read(Memcache:: $list [ $key ],0,shmop_size(Memcache:: $list [ $key ])));
         }
         return false;
     }
 
     public static function set( $key , $val )
     {
         $val =serialize( $val );
         if (isset(Memcache:: $list [ $key ]))
         {
             shmop_close(Memcache:: $list [ $key ]);
         }
         Memcache:: $list [ $key ] = shmop_open( ftok ( __FILE__ , $key ), "c" ,0664, strlen ( $val ));
         shmop_write(Memcache:: $list [ $key ], $val ,0);
         return true;
     }
 
     public static function del( $key )
     {
         if (isset(Memcache:: $list [ $key ]))
         {
             return shmop_delete(Memcache:: $list [ $key ]);
         }
     }
 
     public static function close()
     {
         while (! empty (Memcache:: $list ))
         {
             shmop_close( array_pop (Memcache:: $list ));
         }
         return true;
     }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值