首页 > zendframework缓存之sqlite,file类型缓存实例

zendframework缓存之sqlite,file类型缓存实例

2013-01-16   hisenKing

zend缓存功能比较全,其中部分缓存方式可以通过id和tag进行操作,这样极大的方面了缓存的控制。 手册上对sqlite的缓存只是点到即止,其中测试的时候由于想当然也掉了坑里面。 使用sqlite,以及文件形式的缓存,支持id和tag方式(id是唯一的,tag可以有多个),个人觉得非常实用

$frontendOptions = array(
   // 缓存生命期,以秒为计算单位
   'lifeTime' => 10, 
   // 是否开启序列化,湖缓存array类型数据的时候必须开启
   'automatic_serialization' => true 
);

$backendOptions = array(
    // 放缓存文件的目录
    'cache_db_complete_path' => APPLICATION_PATH . '/cache/sqlite/cache.db' 
);

// 取得一个Zend_Cache_Core 对象
$cache = Zend_Cache::factory('Output',
                             'Sqlite',
                             $frontendOptions,
                             $backendOptions);

可能遇到的问题,以及注意点 如果未开启sqlite报错 Fatal error: Uncaught exception 'ZendCacheException' with message 'Cannot use SQLite storage because the 'sqlite' extension is not loaded in the current PHP environment' 代开php.ini找到;extension=phpsqlite.dll一行,去掉前面的';'分号并重启服务器就可以了。 如果存array的话,不开启'automaticserialization' => true报错 Fatal error: Uncaught exception 'ZendCacheException' with message 'Datas must be string or set automatic_serialization = true'

这里踩了坑以为必须像安装wordpress等软件一样需要进行创建数据库,结果不小心在里面还定义了一个表。导致一直报错 Fatal error: Uncaught exception 'ZendCacheException' with message 'Impossible to open

查看源代码只要定义好sqlite的完整的数据库文件路径,会自动创建数据库文件

保存数据

$cache->save($city,'city',array('tagA','tagB'));
读取数据
$data = $cache->load('city',$doNotTestCacheValidity);
$doNotTestCacheValidity bool类型,表示是否滤掉过期的数据,默认为false 删除id
$cache->remove($id);
删除tag对应的缓存有一下几种方式
$cache->clean($mode,'tagA');

* Zend_Cache::CLEANING_MODE_ALL (default)    => 删除全部的缓存信息,无需传递tags
* Zend_Cache::CLEANING_MODE_OLD              => 删除过期的缓存信息,无需传递tags
* Zend_Cache::CLEANING_MODE_MATCHING_TAG     => 删除匹配的tag缓存,传递的tag可以是数组或是字符串
* Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG => 删除未匹配的tag缓存,传递的tag可以是数组或是字符串
* Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG => 删除任意匹配的tag缓存,传递的tag可以是数组或是字符串)

SQLITE实例:

php端代码:

<?php
   public function trycachesqliteAction()
   {
        $frontendOptions = array(
           'lifeTime' => 7200,
           'automatic_serialization' => true
        );

        $backendOptions = array(
            'cache_db_complete_path'=>APPLICATION_PATH.'/cache/cache.db'
        );

        $cache = Zend_Cache::factory('Output',
                                     'Sqlite',
                                     $frontendOptions,
                                     $backendOptions);


        $id = 'province';
        if (!($data = $cache->load($id))) {
            $data = array('湖南','湖北');
            $cache->save($data);
        }

        $this->view->data = implode('","', $data);
    }

html代码:

    $("#autocomplete").autocomplete(["<?php echo $this->data; ?>"], {
        width: 320,
        max: 4,
        highlight: false,
        multiple: true,
        multipleSeparator: " ",
        scroll: true,
        scrollHeight: 300
    });

效果: zend缓存

FILE类型实例:

php端:

    $frontendOptions = array(
       'lifeTime' => 60, // 一分钟的缓存生命期
       'automatic_serialization' => true
    );

    $backendOptions = array(
        'cache_dir' => APPLICATION_PATH . '/cache/ztree' // 放缓存文件的目录
    );

    // 取得一个Zend_Cache_Core 对象
    $cache = Zend_Cache::factory('Output',
                                 'File',
                                 $frontendOptions,
                                 $backendOptions);


    $id = 'city'; // 缓存的id
    if (!($data = $cache->load($id))) {
        $city = array(
                '浙江' => array('杭州','温州','宁波','绍兴'),
                '江苏' => array('南京','无锡','扬州','南通'),
                '福建' => array('厦门')
        );

        $id = 0;
        foreach ($city as $key => $value) {
            $pData = array('name' => $key);
            foreach ($value as $ckey => $cvalue) {
                $cData[$key][] = array('name' => $cvalue);
            }
            $pData['children'] = $cData[$key];

            $data[] = $pData;
        }
        $cache->save($data,'city',array('city'));

    }

    $jdata = json_encode($data);
    $this->view->data = $jdata;

html端:

<!DOCTYPE html >
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <link rel="stylesheet" href="/js/JQuery zTree v3.5/css/zTreeStyle/zTreeStyle.css" type="text/css">
    </head>
    <body>
    <div class="zTreeDemoBackground left">
        <ul id="treeDemo" class="ztree"></ul>
    </div>
    </body>
    <script type="text/javascript" src="/js/JQuery zTree v3.5/js/jquery-1.4.4.min.js"></script>
    <script type="text/javascript" src="/js/JQuery zTree v3.5/js/jquery.ztree.core-3.5.js"></script>
    <script type="text/javascript">
        <!--
        var setting = {};

        var zNodes = <?php echo $this->data;?>;
        $(document).ready(function(){
            $.fn.zTree.init($("#treeDemo"), setting, zNodes);
        });
        //-->
    </script>
</html>

效果: zend缓存

总结: 在系统数据量的增长和功能逻辑上的复杂性加深,可以预见的不久将加入缓存的功能。目前的做法权限生产数据表,缓存在表中这无形的加大了数据库的负担,个人觉得不是一个很好的方式。

好久没更新了,需要除除草