ecshop源码分析——用cookie缓存sql语句它为什么要将sql语句缓存在客户端的cookie,我暂时也没完全弄清楚。只是做了几个猜测。 先来看它工作的2函数,设置cookie和读取cookie。 /** * 保存过滤条件 * @param array $filter 过滤条件 * @param string $sql 查询语句 * @param string $param_str 参数字符串,由list函数的参数组成 */ function set_filter($filter, $sql, $param_str = '') { $filterfile = basename(PHP_SELF, '.php'); if ($param_str) { $filterfile .= $param_str; } /*设置cookie,将过滤条件$filter和sql语句$sql经常处理之后放入cookie*/ setcookie('ECSCP[lastfilterfile]', sprintf('%X', crc32($filterfile)), time() + 600); setcookie('ECSCP[lastfilter]', urlencode(serialize($filter)), time() + 600); setcookie('ECSCP[lastfiltersql]', urlencode($sql), time() + 600); } 读取cookie /** * 取得上次的过滤条件 * @param string $param_str 参数字符串,由list函数的参数组成 * @return 如果有,返回array('filter' => $filter, 'sql' => $sql);否则返回false */ function get_filter($param_str = '') { $filterfile = basename(PHP_SELF, '.php'); if ($param_str) { $filterfile .= $param_str; } /*如果设置了相应的cookie,返回cookie中的数据*/ if (isset($_GET['uselastfilter']) && isset($_COOKIE['ECSCP']['lastfilterfile']) && $_COOKIE['ECSCP']['lastfilterfile'] == sprintf('%X', crc32($filterfile))) { return array( 'filter' => unserialize(urldecode($_COOKIE['ECSCP']['lastfilter'])), 'sql' => urldecode($_COOKIE['ECSCP']['lastfiltersql']) ); } else { return false; } } 然后我来看一个它实际使用的例子 ecshop/admin/article.php文件中的functio get_articlelist,获取文章列表函数。 /* 获得文章列表 */ function get_articleslist() { $result = get_filter(); If($result===false)//如果没有设置cookie { /*省略相关代码。根据文章过滤条件获取文章列表*/ /* ……………………………………….. */ /*设置cookie,将$filter过滤条件,已经查询的sql语句$sql放进cookie中*/ set_filter($filter, $sql); /* 我们用var_dump()将$filter和$sql打印出来的结果是 array(9) { ["keyword"]=> string(0) "" ["cat_id"]=> int(0) ["sort_by"]=> string(12) "a.article_id" ["sort_order"]=> string(4) "DESC" ["record_count"]=> string(2) "35" ["page_size"]=> int(15) ["page"]=> int(1) ["page_count"]=> float(3) ["start"]=> int(0) } string(154) "SELECT a.* , ac.cat_name FROM `ecs`.`ecs_article` AS a LEFT JOIN `ecs`.`ecs_article_cat` AS ac ON ac.cat_id = a.cat_id WHERE 1 ORDER by a.article_id DESC" 所以它是将以上这些数据存进cookie里面的。 */ else //说明cookie已经存在获取文章列表的sql语句 { /*直接从cookie中获取相应的$Sql和$filter*/ } }
然后再看第二个例子ecshop/admin/goods_type.php文件中的get_goodstype函数,它用来获取商品类型的。该函数的大体结构跟上面那个获取文章列表的结构是类似的。 /** * 获得所有商品类型 * * @access public * @return array */ sfunction get_goodstype() { $result = get_filter(); If($result===flase) { ................. } Else { ……. } }
但是它的cookie机制是只保存一条sql语句,即如果打开文章列表页面,它会将获取文章的sql语句写入cookie中,然后我们接着打开获取商品类型列表的一面,现在那条cookie就会将获取商品类型的sql语句更新到刚才的cookie中,如果我们接着又打开了文章列表页面。它就又会将获取文章的sql语句更新入cookie中。 所以它这里的cookie只是缓存的最新的sql一条语句。 在ecshop中set_filter()函数和get_filter()函数被大量使用。 |
|