Cache缓存

webman/cache là một thành phần bộ nhớ cache được phát triển dựa trên symfony/cache, tương thích với môi trường đồng bộ và không đồng bộ, hỗ trợ kết nối hồ bơi.

注意
Tài liệu hiện tại là cho phiên bản webman v2, nếu bạn đang sử dụng phiên bản webman v1, hãy tham khảo v1版本手册

安装

composer require -W webman/cache

示例

<?php
namespace app\controller;

use support\Request;
use support\Cache;

class UserController
{
    public function db(Request $request)
    {
        $key = 'test_key';
        Cache::set($key, rand());
        return response(Cache::get($key));
    }
}

配置文件位置

Tập tin cấu hình nằm ở config/cache.php, nếu không có, hãy tạo thủ công.

配置文件内容

<?php
return [
    'default' => 'file',
    'stores' => [
        'file' => [
            'driver' => 'file',
            'path' => runtime_path('cache')
        ],
        'redis' => [
            'driver' => 'redis',
            'connection' => 'default'
        ],
        'array' => [
            'driver' => 'array'
        ],
        'apcu' => [
            'driver' => 'apcu'
        ]
    ]
];

stores.driver hỗ trợ 4 loại driver, file, redis, array, apcu.

file 文件驱动

Đây là driver mặc định, không phụ thuộc vào các thành phần khác, hỗ trợ chia sẻ dữ liệu cache giữa các tiến trình, không hỗ trợ chia sẻ dữ liệu cache giữa nhiều máy chủ.

array 内存驱动

Lưu trữ trong bộ nhớ, hiệu suất tốt nhất, nhưng sẽ chiếm dụng bộ nhớ, không hỗ trợ chia sẻ dữ liệu giữa các tiến trình và máy chủ, sẽ bị mất hiệu lực sau khi tiến trình khởi động lại, thường dùng cho các dự án có lượng dữ liệu cache nhỏ.

apcu 内存驱动

Lưu trữ trong bộ nhớ, hiệu suất chỉ kém hơn array, hỗ trợ chia sẻ dữ liệu cache giữa các tiến trình, không hỗ trợ chia sẻ dữ liệu cache giữa nhiều máy chủ, sẽ bị mất hiệu lực sau khi tiến trình khởi động lại, thường dùng cho các dự án có lượng dữ liệu cache nhỏ.

Cần phải cài đặt và bật APCu 扩展; không nên sử dụng cho các trường hợp ghi/xóa cache thường xuyên, sẽ gây ra sự giảm hiệu suất rõ rệt.

redis 驱动

Phụ thuộc vào thành phần webman/redis, hỗ trợ chia sẻ dữ liệu cache giữa các tiến trình và máy chủ.

stores.redis.connection

stores.redis.connection tương ứng với key trong config/redis.php. Khi sử dụng redis, sẽ tái sử dụng cấu hình của webman/redis, bao gồm cả cấu hình hồ bơi kết nối.

Gợi ý thêm một cấu hình độc lập trong config/redis.php, ví dụ như cache giống như sau

<?php
return [
    'default' => [
        'password' => 'abc123',
        'host' => '127.0.0.1',
        'port' => 6379,
        'database' => 0,
    ],
    'cache' => [ // <==== Thêm mới
        'password' => 'abc123',
        'host' => '127.0.0.1',
        'port' => 6379,
        'database' => 1,
        'prefix' => 'webman_cache-',
    ]
];

Sau đó, đặt stores.redis.connection thành cache, cấu hình cuối cùng trong config/cache.php giống như sau

<?php
return [
    'default' => 'redis', // <==== 
    'stores' => [
        'file' => [
            'driver' => 'file',
            'path' => runtime_path('cache')
        ],
        'redis' => [
            'driver' => 'redis',
            'connection' => 'cache' // <====
        ],
        'array' => [
            'driver' => 'array'
        ]
    ]
];

切换存储

Bạn có thể thay đổi store bằng cách sử dụng mã sau để sử dụng các driver lưu trữ khác nhau, ví dụ

Cache::store('redis')->set('key', 'value');
Cache::store('array')->set('key', 'value');

提示
Tên Key phải tuân theo giới hạn của PSR6, không được phép chứa bất kỳ ký tự nào trong {}()/\@: nhưng điều này có thể tạm thời bỏ qua bằng cách cấu hình PHP ini zend.assertions=-1 tính đến thời điểm hiện tại ( symfony/cache 7.2.4).

使用其它Cache组件

Tham khảo cách sử dụng thành phần ThinkCache trong 其它数据库