You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP/MySQL生成JSON接口性能优化问询:缓存查询结果至磁盘的可行性探讨

PHP/MySQL生成JSON接口性能优化问询:缓存查询结果至磁盘的可行性探讨

我需要从MySQL数据库获取数据,目前用传统的PHP/MySQL预处理语句提取数据,再用json_encode转成JSON然后输出。这个过程耗时将近3秒,而调用这个接口的应用每次至少请求3-4次,等待时间太长了。

我想到:数据更新频率很低,所以打算每天第一次生成查询结果时,把它保存到磁盘文件里!这样后续请求直接读取文件返回就行,不用每次都查数据库转JSON了。

兄弟,你的这个思路完全没问题啊!针对你这种数据更新不频繁的场景,磁盘缓存绝对是低成本高收益的优化方案,能直接把接口响应时间从3秒级压到毫秒级,解决重复请求的等待问题简直是对症下药。

给你几个实操层面的小建议,帮你把这个方案落地得更稳妥:

  • 缓存文件命名与有效期:可以按日期命名缓存文件,比如api_data_20240528.json,这样天然就能实现“每天生成新缓存”的逻辑,不用额外写复杂的过期判断,只要检查文件是否是当天的就行。
  • 主动触发缓存更新:除了被动等待当天第一次请求生成缓存,建议在数据库数据更新的代码里,主动删除对应的旧缓存文件。比如更新数据后执行unlink($cacheFile);,这样下一次请求就会自动生成最新的缓存,避免用户拿到过期数据。
  • 权限与目录处理:提前给缓存存放目录设置好合适的权限(比如chmod 755),确保PHP进程有读写权限;代码里也要先判断目录是否存在,不存在就创建,避免存文件时报错。
  • 缓存有效性校验:每次请求先判断缓存文件是否存在、是否在有效期内(比如是否是当天生成的),满足条件就直接读文件输出,不满足再走数据库查询流程。

给你贴个简单的示例代码,你可以参考着调整:

// 定义缓存文件路径,按日期命名
$cacheDir = 'api_cache';
$cacheFile = $cacheDir . '/data_' . date('Ymd') . '.json';
// 判断缓存是否有效:文件存在且是当天生成的
$isCacheValid = file_exists($cacheFile) && date('Ymd') === date('Ymd', filemtime($cacheFile));

if ($isCacheValid) {
    // 直接返回缓存内容
    header('Content-Type: application/json');
    echo file_get_contents($cacheFile);
    exit;
}

// 缓存无效,执行数据库查询
$dsn = 'mysql:host=localhost;dbname=your_database;charset=utf8mb4';
$pdo = new PDO($dsn, 'your_username', 'your_password');
$stmt = $pdo->prepare('SELECT * FROM your_table WHERE your_condition = ?');
$stmt->execute([$your_param]);
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
$jsonData = json_encode($data, JSON_UNESCAPED_UNICODE);

// 创建缓存目录(如果不存在)
if (!is_dir($cacheDir)) {
    mkdir($cacheDir, 0755, true);
}
// 写入缓存文件
file_put_contents($cacheFile, $jsonData);

// 返回JSON数据
header('Content-Type: application/json');
echo $jsonData;

要是后续你的接口流量变大,还可以考虑升级到Redis这类内存缓存,读取速度会比磁盘更快,但目前你的场景用磁盘缓存完全够用,成本还低。

最后再提个小细节:如果数据不是严格每天更新,偶尔会在当天内更新,一定要记得在数据更新的逻辑里同步清理缓存,不然用户可能会拿到旧数据哦!

备注:内容来源于stack exchange,提问作者OZ1SEJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 17:38:09