getgrav/cache

轻量级文件系统缓存系统

维护者

详细信息

github.com/getgrav/Cache

源代码

v2.0.0 2021-04-20 05:48 UTC

This package is auto-updated.

Last update: 2024-09-20 13:24:28 UTC


README

Build status paypal

这是一个基于文件和目录的轻量级缓存系统。

用法

步骤 1: 安装

通过 composer

{
    "require": {
        "gregwar/cache": "1.0.*"
    }
}

或克隆仓库

git clone https://github.com/Gregwar/Cache.git

或下载

步骤 2: 设置权限

你需要让 PHP 脚本能够访问缓存目录,例如可以创建一个 cache 目录(确保 web 服务器可以写入)

mkdir cache

步骤 3: 访问缓存

要访问缓存,可以这样做

<?php

include('vendor/autoload.php'); // If using composer

use Gregwar\Cache\Cache;

$cache = new Cache;
$cache->setCacheDirectory('cache'); // This is the default

// If the cache exists, this will return it, else, the closure will be called
// to create this image
$data = $cache->getOrCreate('red-square.png', array(), function($filename) {
    $i = imagecreatetruecolor(100, 100);
    imagefill($i, 0, 0, 0xff0000);
    imagepng($i, $filename);
});

header('Content-type: image/png');
echo $data;

这将渲染一个红色方块。如果缓存文件(看起来像 `cache/r/e/d/-/s/red-square.png')存在,它将被读取,否则,将调用闭包以创建缓存文件。

API

你可以使用以下方法

  • setCacheDirectory($directory): 设置缓存目录(见下文)。
  • setActualCacheDirectory($directory): 设置实际缓存目录(见下文)。
  • exists($filename, $conditions = array()): 检查缓存中是否存在 $filename 文件,检查条件(见下文)。
  • check($filename, $conditions = array()): exists 的别名。
  • getCacheFile($filename, $actual = false, $mkdir = false): 获取缓存文件。如果 $actual 标志为 true,将返回实际的缓存文件名(见下文),如果 $mkdir 标志为 true,将创建缓存文件目录树。
  • set($filename, $contents): 将内容写入 $filename 缓存文件。
  • write($filename, $contents): set 的别名。
  • get($filename, $conditions = array()): 如果 $filename 的缓存文件存在,将返回内容,否则返回 NULL
  • setPrefixSize($prefixSize): 设置目录的前缀大小,默认为 5。例如,缓存文件 helloworld.txt 将是 'h/e/l/l/o/helloworld.txt'
  • setDirectoryMode($directoryMode): 设置创建目录时的目录模式,默认为 0755。不影响之前创建的任何目录。
  • getOrCreate($filename, $conditions = array(), $function, $file = false): 这将检查 $filename 缓存文件是否存在并验证 $conditions(见下文)。如果缓存文件正常,将返回其内容。否则,将调用 $function,传递目标文件,此函数可以写入参数中提供的文件或仅返回数据。然后,将返回缓存数据。如果设置了 $file 标志,将返回缓存文件名而不是文件数据。

注意:考虑使用哈希来为 $filename 缓存文件,以避免特殊字符。

条件

你可以使用条件来管理缓存中的文件过期,有两种过期的方法

  • 使用 max-age(以秒为单位),设置文件的最大年龄
  • 使用 younger-than,通过传递另一个文件,这将比较修改日期并在给定文件较新时重新生成缓存

例如,如果你想将文件转换为大写

<?php

use Gregwar\Cache\Cache;

$cache = new Cache;

$data = $cache->getOrCreate('uppercase.txt',
    array(
        'younger-than' => 'original.txt'
    ),
    function() {
        echo "Generating file...\n";
        return strtoupper(file_get_contents('original.txt'));
});

echo $data;

这将创建 uppercase.txt 缓存文件,如果缓存文件不存在或如果 original.txt 文件比缓存文件更新,则将 original.txt 转换为大写。

例如

php uppercase.php  # Will generate the cache file
php uppercase.php  # Will not generate the cache file
touch original.txt # Sets the last modification time to now
php uppercase.php  # Will re-generate the cache file

缓存目录和实际缓存目录

在某些情况下,您可能需要获取缓存文件的名称。例如,如果您正在缓存图片,您将想要提供一个类似 cache/s/o/m/e/i/someimage.png 的字符串,以便将其放入一个 <img> 标签中。这可以通过将 $file 参数传递给 getOrCreate 并将其设置为 true,或者直接使用 getCacheFile 方法(见上文)来实现。

然而,您的用户可见的 cache 目录与您想要访问的绝对路径不同。为了做到这一点,您可以同时设置缓存目录和实际的缓存目录。

缓存目录是用户可见的前缀(例如:cache/s/o/m/e/i/someimage.png),而实际的缓存目录是用于实际访问图片的前缀(例如:/var/www/somesite/cache/s/o/m/e/i/someimage.png)。这样,文件将通过绝对路径访问,并且返回的缓存文件将直接可用于用户的浏览器。

许可证

本存储库受MIT许可证的约束,请参阅 LICENCE 文件。