ThinkPHP缓存S方法与F方法对比及使用详解
ThinkPHP 提供了 F 和 S 两种便捷的数据缓存函数,分别适用于不同场景。S() 支持有效期设置和多类型驱动(如 File、Xcache),适合复杂对象缓存;F() 则针对简单数据类型优化,无需配置即可快速读写文件,且支持自定义子目录结构以减少单文件数量。
S方法:支持有效期的动态缓存
系统默认采用 File 方式缓存,用户可在项目配置文件中定义其他驱动(如 Xcache,需环境支持)。此外,当缓存数据过多导致缓存目录下文件激增时,可通过启用哈希子目录功能来优化存储结构。
准备条件:配置缓存驱动与子目录策略
在项目配置文件 config.php 中,可以设置缓存类型、有效期以及子目录层级:
// 动态缓存,缓存文件存在于\Runtime\Temp
'DATA_CACHE_TYPE' => 'file', // 或设置为 'xcache'、'memcache' 等
'DATA_CACHE_TIME' => '3600', // 默认缓存有效期
// 'DATA_CACHE_SUBDIR' => true, // 开启子目录模式,防止单目录文件过多
// 'DATA_PATH_LEVEL' => 2, // 设置哈希子目录的层次结构
真实操作顺序:数据的缓存、读取与删除
在控制器(Action)逻辑中,使用 S() 方法封装数据库查询结果,可实现自动化的缓存命中判断:
- 初始化查询标识:定义用于识别该组数据的缓存键名。
- 读取缓存数据:调用
$value = S('list');。 - 判断并填充缓存:若结果为空,执行数据库查询,并将结果以指定时间存入缓存。
S('list', $data, 3600)。 - 异常处理:如需手动清除某项缓存,传入
null作为值:S('list', null);。
以下代码演示了在 Action 中使用 S 方法的完整流程,包含从数据库取值到写入缓存的过程:
function view(){
// 模拟数据库模型访问
$user = M('haodetong');
// 1. 尝试获取缓存
$value = S('list');
if(empty($value)){
// 2. 缓存未命中,执行数据库查询
$list = $user->select();
// 3. 写入缓存,设置3600秒有效期
S('list',$list,3600);
echo '这个是直接从数据库中读取的文件';
dump($list);
} else {
// 4. 输出缓存命中内容
echo '这个是缓存文件';
dump($value);
}
}
F方法:专门用于快速文件缓存
F 方法专为文件方式的快速缓存设计,主要优势在于语法更简洁,但不支持有效期参数,且只能缓存简单数据类型(不支持对象)。它会自动在 DATA_PATH 指定的目录下生成对应的 PHP 文件。
真实操作顺序:基本读写与路径指定
在使用 F 方法时,可以直接将数组或变量转为缓存文件:
- 快速缓存数据:
F('data', $data);(默认保存在DATA_PATH) - 指定保存目录:
F('user/data', $data, TEMP_PATH);会在临时目录下创建子文件夹结构。 - 获取缓存数据:
$result = F('data'); - 删除缓存数据:
F('data', null);会直接移除对应的缓存文件。
生成文件的内部结构
F 方法本质上是生成了一个返回数据的 PHP 文件。例如将字符串存储在特定路径下:
$path = "../Public/Runtime/";
$str = "asdfasdfasdaaaaaaaaaaaaaaaaaaaaaa";
F("str/andy", $str, $path);
上述操作会在 ../Public/Runtime/str/andy.php 生成如下内容的文件:
<?php
return 'asdfasdfasdaaaaaaaaaaaaaaaaaaaaaa';
?>
运行效果验证
首次访问页面触发数据库查询并在控制台中看到“直接从数据库中读取”的输出状态如下图所示:
当刷新页面或再次访问时,由于命中了缓存(有效期内不再查库),控制台将打印来自内存或磁盘缓存的数据,提示文案切换为:“这个是缓存文件”。
进阶操作:组合复杂数据的缓存策略
对于需要关联多张表查询的数据,可以在每次请求中动态组装后整体缓存,以提高后续读取效率:
$cache = S($cachename);
// 判断是否有这个查询缓存
if(!$cache) {
$cache = $video->where($map)->order($order)->limit($limit)->select();
foreach($cache as $key => $value){
$userlist = $user->where("id=".$value['user_id'])->find();
$cache[$key]["nickname"] = $userlist['nickname'];
}
// 设置带有效期的复合数据缓存
S($cachename, $cache, 3600);
}
// 手动清理缓存
S($cachename, NULL);
简要总结
S 方法与 F 方法是 ThinkPHP 体系中管理数据的两道防线。当业务场景涉及对象序列化或必须设定明确的缓存失效周期时,应选择配置驱动的 S 方法,利用哈希目录结构应对大数据量下的文件管理难题;而在需要高频读写简单标量数据且希望降低配置复杂度的场景下,F 方法提供的即写即读体验则是更佳选择。
以上就是ThinkPHP缓存S方法与F方法对比及使用详解的详细内容,更多关于ThinkPHP高效缓存配置的实操技巧资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













