-3

这是我编写的一些工作代码,用于调用 JSON 文件并将其缓存在我的服务器上。

我正在调用缓存文件。如果文件存在,我会使用 json_decode 。如果该文件不存在,我将调用 JSON 并对其进行解码。然后在调用 JSON url 后,我将内容写入缓存文件 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 天,请在 else 语句中获取 JSON url?

4

2 回答 2

2

你可以使用类似的东西

$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 />';
}
于 2018-03-01T14:32:00.797 回答
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;
于 2018-03-01T14:33:52.037 回答