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
相关产品推荐
相关产品推荐

