spAccess为啥是实时更新的?

#1 SunPSP

根据说明,spAccess是文件缓存,缓存文件有生存周期
在周期内再次使用时直接调用缓存文件而不再查询数据库
而更新是通过对比时间戳来判断的

目前发现个很灵异的事情,spAccess的缓存文件在每次刷新页面的时候都会更新一次。。。。
而无论缓存周期设置的是多少
看了下spAccess的实现函数,发现变化的部分貌似就是缓存周期的时间
我缓存周期设置的是永久缓存,即-1,生成缓存文件之后
文件头5374004972a
刷新一次页面
文件头5374005043a
发现数字部分,也就是记录缓存的生存周期部分发生变化
变化了71,差不多就是我这打字的时间
那么问下J大,这个缓存周期一直在变,他还怎么判定缓存过期?
附上代码
$$$$uuid = $$$$this->spArgs('subject','b9a5c345');
$$$$blocks = spAccess('r',$$$$uuid);
if(!$$$$blocks)$$$$blocks = spClass('spBlock')->getBlock($$$$uuid);
spAccess("w",$$$$uuid,$$$$blocks);

还有另外一个问题,如果我在接下来的foreach循环中同时使用与相同的缓存方式
那么生成的缓存文件是空的(只有文件头:5374005582b:0;)
附上代码:
$$$$uuid = $$$$this->spArgs('subject','b9a5c345');
$$$$blocks = spAccess('r',$$$$uuid);
if(false == $$$$blocks)$$$$blocks = spClass('spBlock')->getBlock($$$$uuid);
spAccess("w",$$$$uuid,$$$$blocks,-1);
dump($$$$blocks);

foreach($$$$blocks as $$$$block){
switch($$$$block[query]){
case"0";
$$$$block[value] = spAccess('r',$$$$block[blockid]);
if(false == $$$$block[value])spAccess("w",$$$$block[blockid],$$$$block[value],300);
$$$$this->$$$$block[blockid] = $$$$block[value];
break;
}
}
$$$$this->display('index.html');
如果去掉spAccess,那么就正常了
附代码:
foreach($$$$blocks as $$$$block){
switch($$$$block[query]){
case"0";
$$$$this->$$$$block[blockid] = $$$$block[value];
break;
}
}
求解惑

2013-07-17 04:19:33

#2 jake

第一段代码,每次都有 spAccess("w",$uuid,$blocks); 所以每次都缓存都会变化,写入数据肯定就要变化的。

第二段,逻辑很乱,循环里面的值又是判定又是赋值。如果blocks真有值在里面,建议是在每次循环的时候dump一下值出来看看。然后 $block["value"] 改成一个临时变量,只作为判断,值还是保留原来的值来用。把代码理顺了,估计你的问题也能看清楚了。

另外,数组的键最好还是 用引号括起来。

2013-07-17 08:53:06

#3 拓文

代码中看不出设置了缓存过期时间

2013-07-17 09:26:44

#4 SunPSP

jake 发表于 2013-7-17 08:53
第一段代码,每次都有 spAccess("w",$uuid,$blocks); 所以每次都缓存都会变化,写入数据肯定就要变化的。

...
第一段的更新问题找到了
那个spAcess的用法是根据在另外一个帖子的回复写的
是忘记在IF中加大括号把spAccess写操作包含到IF内才出现的问题

第二段是这么个情况
从数据库获取到的数组结构
Array
(
    [0] => Array
        (
            [blockid] => 7ea99ebd
            [subjectid] => b9a5c345
            [value] => web_id=5321970
            [query] => 0
        )

    [1] => Array
        (
            [blockid] => 0acc9600
            [subjectid] => b9a5c345
            [value] => web_id=5304567
            [query] => 1
        )
需求是根据query键的值(0或者1)确定是直接将value键赋值到模板还是经过处理后再赋值到模板
我的想法是用foreach取到每个子数组
然后用switch根据query值来确定是直接赋值还是处理后再赋值
原来是打算用IF的,又感觉还是switch来的方便
请J大帮忙分析下逻辑上的问题,自学编程不久,逻辑问题经常搞不清楚

2013-07-18 01:36:59

#5 SunPSP

拓文 发表于 2013-7-17 09:26
代码中看不出设置了缓存过期时间
感谢回复
spAccess的最后一个参数表示缓存时间,以秒为单位
如果留空,则默认是永久缓存
不过所谓的永久缓存,就是把默认的缓存时间设置成一个非常大的数值
貌似是3000000000秒。。。。。
反正如果不手动更新,有生之年是看不见他会变了{:soso_e128:}

2013-07-18 01:41:28

#6 jake

SunPSP 发表于 2013-7-18 01:36
第一段的更新问题找到了
那个spAcess的用法是根据在另外一个帖子的回复写的
是忘记在IF中加大括号把spAcc ...
只有两条记录? 看样子你的数据是两条一对的,但是就不知道是不是只有两条记录。

如果是多条记录,两两一对,这样的数据结构非常古怪。

那么只能用for(foreach不太行),然后加个步长上去循环。



2013-07-18 09:02:48