Кэширование JSON на сервере с использованием срока действия?

Это некоторый рабочий код, который я написал для вызова файла JSON и кэширования его на моих серверах.

Я звоню в кешированный файл. Если файл существует, я использую json_decode. Если файл не существует, я вызываю JSON и декодирую его. Затем после вызова URL JSON я записываю содержимое в URL кэшированного файла.

$cache = @file_get_contents('cache/'.$filename.'.txt');

//check to see if file exists:
if (strlen($cache)<1) {

// file is empty
echo '<notcached />';
$JSON1= @file_get_contents($url);

$JSON_Data1 = json_decode($JSON1);

$myfile = fopen('cache/'.$filename.'.txt', "w");
$put = file_put_contents('cache/'.$filename.'.txt', ($JSON1));

} else {

//if file doesn't exist:
$JSON_Data1 = json_decode($cache);
echo '<cached />';
}

Вместо того, чтобы использовать только if (strlen($cache)<1) {Есть ли способ, которым я могу проверить возраст $ filename.txt и, если он старше 30 дней, получить URL JSON в операторе else?

-3

Решение

Вы можете использовать что-то вроде

$file = 'cache/'.$filename.'.txt';
$modify = filemtime($file);
//check to see if file exists:
if ($modify == false || $modify < strtotime('now -30 day')) {
// file is empty, or too old
echo '<notcached />';
} else {
// Good to use file
echo '<cached />';
}

filemtime() возвращает время последнего изменения файла, оператор if проверяет, что файл существует (filemtime возвращает false, если произойдет сбой) или файл был последний раз изменен более 30 дней назад.

ИЛИ ЖЕ…
проверить, существует ли файл или слишком старый (без предупреждений)

$file = 'cache/'.$filename.'.txt';
if (file_exists($file) == false || filemtime($file) < strtotime('now -30 day')) {
// file is empty, or too old
echo '<notcached />';
} else {
// Good to use file
echo '<cached />';
}
2

Другие решения

Я использовал простой класс файлового кэша в моих предыдущих проектах, я думаю, это должно вам помочь. Я думаю, что это легко понять, время кеша в секундах и setFilename Функция очищает имя файла, если оно содержит недопустимые символы.

<?php

class SimpleFileCache
{
var $cache_path = 'cache/';
var $cache_time = 3600;
var $cache_file;

function __construct($name)
{
$this->setFilename($name);
}

function getFilename()
{
return $this->cache_file;
}

function setFilename($name)
{
$this->cache_file = $this->cache_path . preg_replace('/[^0-9a-z\.\_\-]/', '', strtolower($name));
}

function isCached()
{
return (file_exists($this->cache_file) && (filemtime($this->cache_file) + $this->cache_time >= time()));
}

function getData()
{
return file_get_contents($this->cache_file);
}

function setData($data)
{
if (!empty($data)) {
return file_put_contents($this->cache_file, $data) > 0;
}
return false;
}
}

Это можно использовать так.

<?php

require_once 'SimpleFileCache.php';

$cache = new SimpleFileCache('cache.json');
if ($cache->isCached()) {
$json = $cache->getData();
} else {
$json = json_encode($someData); // set your cache data
$cache->setData($json);
}

header('Content-type: application/json');
echo $json;
2