blazon/psr11-symfony-cache

PSR-11 的 Symfony Cache 组件工厂

0.0.2 2021-07-19 20:25 UTC

This package is auto-updated.

Last update: 2024-09-20 03:30:57 UTC


README

codecov pipeline status

PSR-11 Symfony Cache

为 PSR-11 提供的 Symfony Cache 组件 工厂。

目录

安装

composer require blazon/psr11-symfony-cache

使用

<?php
/** @var \Symfony\Component\Cache\Adapter\AdapterInterface $cache */
$cache = $container->get('other');

// The callable will only be executed on a cache miss.
$value = $cache->get('my_cache_key', function (\Symfony\Contracts\Cache\ItemInterface $item) {
    $item->expiresAfter(3600);

    // ... do some HTTP request or heavy computations
    $computedValue = 'foobar';

    return $computedValue;
});

echo $value; // 'foobar'

更多详细信息请参阅 文档

容器

任何 PSR-11 容器都可以工作。为了做到这一点,您需要添加配置并注册一个指向 Blazon\PSR11SymfonyCache\CacheFactory 的新服务。

以下是一些具体的容器示例以供您开始

Pimple 示例

// Create Container
$container = new \Xtreamwayz\Pimple\Container([
    // Cache using the default keys.
    'cache' => new \Blazon\PSR11SymfonyCache\CacheFactory(),
    
    // Second cache using a different cache configuration
    'other' => function($c) {
        return \Blazon\PSR11SymfonyCache\CacheFactory::other($c);
    },
    
    // Config
    'config' => [
        'symfonyCache' => [
            // At the bare minimum you must include a default adaptor.
            'default' => [  
                'type' => '',
                'options' => [],
            ],
            
            // Some other Adaptor.  Keys are the names for each adaptor
            'someOtherAdaptor' => [
                'type' => 'local',
                'options' => [
                    'root' => '/tmp/pimple'
                ],
            ],
        ],
    ]
]);

/** @var \Symfony\Component\Cache\Adapter\AdapterInterface $cache */
$cache = $container->get('other');
// The callable will only be executed on a cache miss.
$value = $cache->get('my_cache_key', function (\Symfony\Contracts\Cache\ItemInterface $item) {
    $item->expiresAfter(3600);

    // ... do some HTTP request or heavy computations
    $computedValue = 'foobar';

    return $computedValue;
});

echo $value; // 'foobar'

// ... and to remove the cache key
$cache->delete('my_cache_key');

Laminas Service Manager

// Create the container and define the services you'd like to use
$container = new \Zend\ServiceManager\ServiceManager([
    'factories' => [
        // Cache using the default keys.
        'fileSystem' => \Blazon\PSR11SymfonyCache\CacheFactory::class,
        
        // Second cache using a different cache configuration
        'other' => [\Blazon\PSR11SymfonyCache\CacheFactory::class, 'other'],
    ],
]);

// Config
$container->setService('config', [
    'symfonyCache' => [
        // At the bare minimum you must include a default adaptor.
        'default' => [  
            'type' => '',
            'options' => [],
        ],
        
        // Some other Adaptor.  Keys are the names for each adaptor
        'someOtherAdaptor' => [
            'type' => 'local',
            'options' => [
                'root' => '/tmp/pimple'
            ],
        ],
    ],
]);

/** @var \Symfony\Component\Cache\Adapter\AdapterInterface $cache */
$cache = $container->get('other');
// The callable will only be executed on a cache miss.
$value = $cache->get('my_cache_key', function (\Symfony\Contracts\Cache\ItemInterface $item) {
    $item->expiresAfter(3600);

    // ... do some HTTP request or heavy computations
    $computedValue = 'foobar';

    return $computedValue;
});

echo $value; // 'foobar'

// ... and to remove the cache key
$cache->delete('my_cache_key');

框架

任何使用 PSR-11 的框架都应正常工作。以下是一些具体的框架示例以供您开始

Mezzio

您需要添加配置并注册您想要使用的服务。有多种方法可以实现这一点,但推荐的方式是创建一个新的配置文件 config/autoload/cache.global.php

配置

config/autoload/cache.global.php

<?php
return [
    'dependencies' => [
        'factories' => [
            // Cache using the default keys.
            'fileSystem' => \Blazon\PSR11SymfonyCache\CacheFactory::class,
            
            // Second cache using a different filesystem configuration
            'someOtherAdaptor' => [\Blazon\PSR11SymfonyCache\CacheFactory::class, 'someOtherAdaptor'],
        ],
    ],
    
    'symfonyCache' => [
        // At the bare minimum you must include a default adaptor.
        'default' => [  
            'type' => '',
            'options' => [],
        ],
        
        // Some other Adaptor.  Keys are the names for each adaptor
        'someOtherAdaptor' => [
            'type' => 'local',
            'options' => [
                'root' => '/tmp/pimple'
            ],
        ],
    ],
];

Laminas

您需要添加配置并注册您想要使用的服务。有多种方法可以实现这一点,但推荐的方式是创建一个新的配置文件 config/autoload/cache.global.php

配置

config/autoload/cache.global.php

<?php
return [
    'service_manager' => [
        'factories' => [
            // Cache using the default keys.
            'fileSystem' => \Blazon\PSR11SymfonyCache\CacheFactory::class,
            
            // Second cache using a different configuration
            'someOtherAdaptor' => [\Blazon\PSR11SymfonyCache\CacheFactory::class, 'someOtherAdaptor'],
        ],
    ],
    
    'symfonyCache' => [
        // At the bare minimum you must include a default adaptor.
        'default' => [  
            'type' => '',
            'options' => [],
        ],
        
        // Some other Adaptor.  Keys are the names for each adaptor
        'someOtherAdaptor' => [
            'type' => 'local',
            'options' => [
                'root' => '/tmp/pimple'
            ],
        ],
    ],
];

Slim

public/index.php

<?php
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;
use \Symfony\Component\Cache\Adapter\AdapterInterface;
use \Symfony\Contracts\Cache\ItemInterface;

require '../vendor/autoload.php';

// Add Configuration
$config = [
    'settings' => [
        'symfonyCache' => [
            // At the bare minimum you must include a default adaptor.
            'default' => [  
                'type' => '',
                'options' => [],
            ],
            
            // Some other Adaptor.  Keys are the names for each adaptor
            'someOtherAdaptor' => [
                'type' => 'local',
                'options' => [
                    'root' => '/tmp/pimple'
                ],
            ],
        ],
    ],
];

$app = new \Slim\App($config);

// Wire up the factory
$container = $app->getContainer();

// Cache using the default keys.
$container['fileSystem'] = new \Blazon\PSR11SymfonyCache\CacheFactory();

// Second cache using a different cache configuration
$container['someOtherAdaptor'] = function ($c) {
    return \Blazon\PSR11SymfonyCache\CacheFactory::someOtherAdaptor($c);
};


// Example usage
$app->get('/example', function (Request $request, Response $response) {
    
    /** @var AdapterInterface $cache */
    $cache = $this->get('other');
    // The callable will only be executed on a cache miss.
    $value = $cache->get('my_cache_key', function (ItemInterface $item) {
        $item->expiresAfter(3600);
    
        // ... do some HTTP request or heavy computations
        $computedValue = 'foobar';
    
        return $computedValue;
    });
    
    echo $value; // 'foobar'
    
    // ... and to remove the cache key
    $cache->delete('my_cache_key');
});

$app->run();

配置

最小配置

最小配置至少需要定义一个服务和“默认”适配器。

最小示例(使用 Zend Expressive 作为示例)

<?php

return [
    'symfonyCache' => [
        'default' => [  
            'type' => '',
            'options' => [],
        ],
    ],
];

使用此设置,您将使用带有“默认”适配器的“默认”文件系统。在此示例中,我们将使用本地文件适配器作为默认适配器。

完整配置

注意:需要一个“默认”适配器。

完整示例

<?php

return [
    'symfonyCache' => [
        // At the bare minimum you must include a default adaptor.
        'default' => [  
            'type' => '',
            'options' => [],
        ],
        
        // Some other Adaptor.  Keys are the names for each adaptor
        'someOtherAdaptor' => [
            'type' => 'local',
            'options' => [
                'root' => '/tmp/pimple'
            ],
        ],
    ],
];

适配器

支持适配器的示例配置

APCu

此适配器是一个高性能、共享内存缓存。由于其缓存内容存储在共享内存中,这比许多其他组件(如文件系统)快得多,因此它可以显著提高应用程序的性能。

<?php

return [
    'symfonyCache' => [
        'default' => [  
            'type' => 'APCu',
            'options' => [
                'namespace' => '', // Optional : a string prefixed to the keys of the items.
                'defaultLifetime' => 0, // Optional : the default lifetime (in seconds) for cache items.  Default: 0
                'version' => null, // Optional : Version of the cache items.
            ],
        ],
    ],
];

文档: APCu 缓存适配器

数组

通常,此适配器适用于测试目的,因为其内容存储在内存中,并且不会以任何方式持久化到运行中的 PHP 进程之外。它还可以在预热缓存时有用,因为具有 getValues() 方法。

<?php

return [
    'symfonyCache' => [
        'default' => [  
            'type' => 'Array',
            'options' => [
                'defaultLifetime' => 0, // Optional : the default lifetime (in seconds) for cache items.  Default: 0
                'storeSerialized' => true, // Optional : values saved in the cache are serialized before storing them Default: true
                'maxLifetime' => 0, // Optional : the maximum lifetime (in seconds) of the entire cache.  Default: 0
                'maxItems' => 0, // Optional : the maximum number of items that can be stored in the cache.  Default: 0
            ],
        ],
    ],
];

文档: APCu 缓存适配器

此适配器允许组合任何数量的其他可用缓存适配器。缓存项目从包含它们的第一个适配器中检索,并将缓存项目保存到所有给定的适配器中。这提供了一种简单高效的方法来创建分层缓存。

<?php

return [
    'symfonyCache' => [
        'default' => [  
            'type' => 'Chain',
            'options' => [
                'adapters' => [], // Required : The ordered list of adapter service names to fetch cached items
                'namespace' => '', // Optional : a string prefixed to the keys of the items.
                'maxLifetime' => 0, // Optional : The max lifetime of items propagated from lower adapters to upper ones
            ],
        ],
    ],
];

文档: 链缓存适配器

Couchbase

此适配器使用一个(或多个)Couchbase 服务器实例将值存储在内存中。与 APCu 适配器不同,类似于 Memcached 适配器,它不受当前服务器共享内存的限制;您可以独立于您的 PHP 环境存储内容。还可以利用服务器集群来提供冗余和/或故障转移。

<?php

return [
    'symfonyCache' => [
        'default' => [  
            'type' => 'Couchbase',
            'options' => [
                // Connection config
                // You must provide a client service, dsn(s) or connection information
                'client' => 'service-name', // Couch Service name.  Will be pulled from the container.
                'dsn' => 'string or array', // Dsn for connections.  Can be one dsn or an array of dsn's

                // Manual connection
                'username' => 'username', // Required for manual connection
                'password' => 'password', // Required for manual connection
                'operationTimeout' => 2500000, // Optional.  Default: 2500000
                'configTimeout' => 5000000, // Optional.  Default: 5000000
                'configNodeTimeout' => 2000000, // Optional.  Default: 2000000
                'viewTimeout' => 75000000, // Optional.  Default: 75000000
                'httpTimeout' => 75000000, // Optional.  Default: 75000000
                'configDelay' => 10000, // Optional.  Default: 10000
                'htconfigIdleTimeout' => 4294967295, // Optional.  Default: 4294967295
                'durabilityInterval' => 100000, // Optional.  Default: 100000
                'durabilityTimeout' => 5000000, // Optional.  Default: 5000000
                
                // Cache Config
                'namespace' => '', // Optional : a string prefixed to the keys of the items.
                'maxLifetime' => 0, // Optional : The max lifetime of items propagated from lower adapters to upper ones
            ],
        ],
    ],
];

文档: Couchbase 缓存适配器

Doctrine

此适配器封装了任何扩展 Doctrine 缓存抽象提供程序的类,允许您将这些提供程序作为 Symfony 缓存适配器在您的应用程序中使用。

<?php

return [
    'symfonyCache' => [
        'default' => [  
            'type' => 'Doctrine',
            'options' => [
                'provider' => 'service-name', // Required : Doctrine Cache Service name.  Will be pulled from the container.
                'namespace' => '', // Optional : a string prefixed to the keys of the items.
                'maxLifetime' => 0, // Optional : The max lifetime of items propagated from lower adapters to upper ones
            ],
        ],
    ],
];

文档: Doctrine 缓存适配器

文件系统

此适配器为那些无法在其环境中安装 APCu 或 Redis 等工具的用户提供了改进的应用程序性能。它将缓存项的过期时间和内容以常规文件的形式存储在本地挂载文件系统的一组目录中。

<?php

return [
    'symfonyCache' => [
        'default' => [  
            'type' => 'Filesystem',
            'options' => [
                'directory' => '', // Optional : The main cache directory.  Default: directory is created inside the system temporary directory
                'namespace' => '', // Optional : a string prefixed to the keys of the items.
                'defaultLifetime' => 0, // Optional : the default lifetime (in seconds) for cache items.  Default: '0'
            ],
        ],
    ],
];

文档: 文件系统缓存适配器

Memcached

此适配器使用一个(或多个)Memcached 服务器实例在内存中存储值。与 APCu 适配器不同,它与 Redis 适配器类似,不受当前服务器共享内存的限制;您可以在不依赖于您的 PHP 环境的情况下存储内容。还可以使用服务器集群提供冗余和/或故障转移的能力。

<?php

return [
    'symfonyCache' => [
        'default' => [  
            'type' => 'Memcached',
            'options' => [
                // Connection config
                // A client service, or dsn(s).  Default: localhost
                'client' => 'service-name', // Memcached service name.  Will be pulled from the container.
                'dsn' => 'string or array', // Dsn for connections.  Can be one dsn or an array of dsn's

                // Options
                'auto_eject_hosts' => false, // Optional.  Default: false
                'buffer_writes' => false, // Optional.  Default: false
                'compression' => true, // Optional.  Default: true
                'compression_type' => 'fastlz', // Optional.  Default: Varies based on flags used at compilation
                'connect_timeout' => 1000, // Optional.  Default: 1000
                'distribution' => 'consistent', // Optional.  Default: consistent
                'hash' => 'md5', // Optional.  Default: md5
                'libketama_compatible' => true, // Optional.  Default: true
                'no_block' => true, // Optional.  Default: true
                'number_of_replicas' => 0, // Optional.  Default: 0
                'prefix_key' => '', // Optional.  Default: empty string
                'poll_timeout' => 1000, // Optional.  Default: 1000
                'randomize_replica_read' => false, // Optional.  Default: false
                'recv_timeout' => 0, // Optional.  Default: 0
                'retry_timeout' => 0, // Optional.  Default: 0
                'send_timeout' => 0, // Optional.  Default: 0
                'serializer' => 'php', // Optional.  Default: php
                'server_failure_limit' => 0, // Optional.  Default: 0
                'socket_recv_size' => 0, // Optional.  Default: varies by platform and kernel
                'socket_send_size' => 0, // Optional.  Default: varies by platform and kernel
                'tcp_keepalive' => false, // Optional.  Default: false
                'tcp_nodelay' => false, // Optional.  Default: false
                'use_udp' => false, // Optional.  Default: false
                'verify_key' => false, // Optional.  Default: false
                
                // Cache Config
                'namespace' => '', // Optional : a string prefixed to the keys of the items.
                'maxLifetime' => 0, // Optional : The max lifetime of items propagated from lower adapters to upper ones
            ],
        ],
    ],
];

文档: Memcached 缓存适配器

PDO 和 Doctrine DBAL

此适配器将缓存项存储在 SQL 数据库中。

<?php

return [
    'symfonyCache' => [
        'default' => [  
            'type' => 'PDO',
            'options' => [
                'client' => 'service-name', // Required: A client service, or dsn(s). 
                
                'db_table' => 'cache_items', // Optional.  The name of the table.  Default: cache_items
                'db_id_col' => 'item_id', // Optional.  The column where to store the cache id.  Default: item_id
                'db_data_col' => 'item_data', // Optional.  The column where to store the cache data.  Default: item_data
                'db_lifetime_col' => 'item_lifetime', // Optional.  The column where to store the lifetime.  Default: item_lifetime
                'db_time_col' => 'item_time', // Optional.  The column where to store the timestamp.  Default: item_time
                'db_username' => '', // Optional.  The username when lazy-connect
                'db_password' => '', // Optional.  The password when lazy-connect
                'db_connection_options' => '', // Optional.  An array of driver-specific connection options
                
                // Cache Config
                'namespace' => '', // Optional : a string prefixed to the keys of the items.
                'maxLifetime' => 0, // Optional : The max lifetime of items propagated from lower adapters to upper ones
            ],
        ],
    ],
];

文档: PDO & Doctrine DBAL 缓存适配器

PHP 数组

此适配器是一个高性能的静态数据(例如应用程序配置)缓存,它经过优化并预先加载到 OPcache 内存存储中。它适用于在预热后大多数数据都是只读的任何数据。

<?php

return [
    'symfonyCache' => [
        'default' => [  
            'type' => 'PhpArray',
            'options' => [
                'filePath' => __DIR__ . '/somefile.cache', // Required: Single file where values are cached
                'backupCache' => 'service-name', // Required: A backup cache service
            ],
        ],
    ],
];

文档: PHP 数组缓存适配器

PHP 文件

与文件系统适配器类似,这种缓存实现将缓存条目写入磁盘,但与文件系统缓存适配器不同,PHP 文件缓存适配器以原生 PHP 代码写入和读取这些缓存文件。

<?php

return [
    'symfonyCache' => [
        'default' => [  
            'type' => 'PhpFiles',
            'options' => [
                'directory' => '/some/dir/path', // Required: The main cache directory (the application needs read-write permissions on it)
                
                // Cache Config
                'namespace' => '', // Optional : a string prefixed to the keys of the items.
                'maxLifetime' => 0, // Optional : The max lifetime of items propagated from lower adapters to upper ones
            ],
        ],
    ],
];

文档: PHP 文件缓存适配器

代理

此适配器封装了一个符合 PSR-6 的缓存项池接口。它通过消耗任何实现 Psr\Cache\CacheItemPoolInterface 的实现来将您的应用程序的缓存项池实现与 Symfony 缓存组件集成。

它还可以用于在存储项目到装饰池之前自动添加所有键的前缀,从而有效地从单个池中创建多个命名空间池。

<?php

return [
    'symfonyCache' => [
        'default' => [  
            'type' => 'proxy',
            'options' => [
                'psr6Service' => 'service-name', // Required: A PSR 6 cache service

                // Cache Config
                'namespace' => '', // Optional : a string prefixed to the keys of the items.
                'maxLifetime' => 0, // Optional : The max lifetime of items propagated from lower adapters to upper ones
            ],
        ],
    ],
];

文档: 代理缓存适配器

Redis

此适配器使用一个(或多个)Redis 服务器实例在内存中存储值。

与 APCu 适配器不同,它与 Memcached 适配器类似,不受当前服务器共享内存的限制;您可以在不依赖于您的 PHP 环境的情况下存储内容。还可以使用服务器集群提供冗余和/或故障转移的能力。

<?php

return [
    'symfonyCache' => [
        'default' => [  
            'type' => 'Redis',
            'options' => [
                // Connection config
                // A client service, or dsn(s) is required.  Default: localhost
                'client' => 'service-name', // Redis service name.  Will be pulled from the container.
                'dsn' => 'redis://[pass@][ip|host|socket[:port]][/db-index]', // Dsn for connections.

                // Connection Options.  Not needed if using a service.
                'class' => '\Redis', // Optional.  Specifies the connection library to return, either \Redis or \Predis\Client. Default: \Redis
                'compression' => true, // Optional.  Enables or disables compression of items. Default: true
                'lazy' => false, // Optional.  Enables or disables lazy connections to the backend. Default: false
                'persistent' => 0, // Optional.  Enables or disables use of persistent connections. Default: 0
                'persistent_id' => 'some-id', // Optional.  Specifies the persistent id string to use for a persistent connection. Default: null
                'read_timeout' => 0, // Optional.  Specifies the read timeout. Default: 0
                'retry_interval' => 0, // Optional.  Specifies the delay (in milliseconds) between reconnection attempts. Default: 0
                'tcp_keepalive' => 0, // Optional.  Specifies the TCP-keepalive timeout (in seconds) of the connection. Default: 0
                'timeout' => 30, // Optional.  Specifies the timeout (in seconds) used to connect to a Redis server. Default: 30
                
                // Cache Config
                'namespace' => '', // Optional : a string prefixed to the keys of the items.
                'maxLifetime' => 0, // Optional : The max lifetime of items propagated from lower adapters to upper ones
            ],
        ],
    ],
];

文档: Redis 缓存适配器

这些文档(包括代码示例)根据 Creative Commons BY-SA 3.0 许可证授权。