由于第三方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;
}
总结