由于第三方API会有调用限制,我们需要将数据保存在服务器上,写入到服务器缓存文件中或者数据库中。
逻辑
我们要使用指定数据之前先判断数据是否在缓存中,判断数据有没有过期。如果过期,那么重新从第三方api获取最新数据, 传给客户端并写入到缓存中。
示例
假设一个使用场景,从第三方获取气象数据。
强制当前时区为上海,判断是否有weather.php这个缓存文件,如果没有,创建它。并写入默认数据:
date_default_timezone_set("Asia/Shanghai");
$weather = '';
$weather_new = '';
$filename = ABAPATH . '/cache/weather.php'; // ABAPATH为绝对路径常量
if (!is_file($filename)) {
$fp = fopen($filename, "w");
fwrite($fp, '<?php exit();?>{"expire_time":1,"data":""}');
fclose($fp);
}
解析缓存数据:
$weather_cache = trim(substr(file_get_contents($filename), 15));
$weather_cache = json_decode($weather_cache);
如果没有缓存或者缓存过期,重新获取数据,并写入缓存:
if (empty($weather_cache) || $weather_cache->expire_time < time()) {
$requestURL = "https://devapi.qweather.com/v7/weather/7d";
$weather = file_get_contents($requestURL);
$weather = gzdecode($weather); // 不是必须的,有些数据需要gzip解压,以实际项目为准。
if (!empty($weather)) {
$weather_cache->expire_time = time() + 1800; // 1800秒后过期
$weather_cache->data = $weather;
$weather_new = json_encode($weather_cache);
$fp = fopen($filename, "w");
fwrite($fp, "<?php exit();?>" . $weather_new);
fclose($fp);
}
} else {
$weather = $weather_cache->data;
}
总结
- 通过is_file()判断文件是否存在
- fopen,fwrite,fclose方法打开(创建)文件,写入数据
- file_get_contents方法获取数据
- 开头插入<?php exit();?>以防缓存文件被直接读取泄露数据
评论区
发表新的留言
您可以留言提出您的疑问或建议。
您的留言得到回复时,会通过您填写的邮箱提醒您。