ThinkPHP缓存S方法与F方法对比及使用详解

星野
星野
发布时间:2026-10-13 | 5人浏览过
原创

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() 方法封装数据库查询结果,可实现自动化的缓存命中判断:

  1. 初始化查询标识:定义用于识别该组数据的缓存键名。
  2. 读取缓存数据:调用 $value = S('list');。
  3. 判断并填充缓存:若结果为空,执行数据库查询,并将结果以指定时间存入缓存。S('list', $data, 3600)。
  4. 异常处理:如需手动清除某项缓存,传入 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 方法时,可以直接将数组或变量转为缓存文件:

  1. 快速缓存数据:
    F('data', $data);(默认保存在 DATA_PATH)
  2. 指定保存目录:
    F('user/data', $data, TEMP_PATH); 会在临时目录下创建子文件夹结构。
  3. 获取缓存数据:
    $result = F('data');
  4. 删除缓存数据:
    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高效缓存配置的实操技巧资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表