Caching implementation with a variety of storage options, as well as codified caching strategies for callbacks, classes, and output

Overview

laminas-cache

Build Status

Laminas\Cache provides a general cache system for PHP. The Laminas\Cache component is able to cache different patterns (class, object, output, etc) using different storage adapters (DB, File, Memcache, etc).

Standalone

If this component is used without laminas-mvc or mezzio, a PSR-11 container to fetch services, adapters, plugins, etc. is needed.

The easiest way would be to use laminas-config-aggregator along with laminas-servicemanager.

use Laminas\Cache\ConfigProvider;
use Laminas\Cache\Service\StorageAdapterFactoryInterface;
use Laminas\Cache\Storage\Adapter\Memory;
use Laminas\ConfigAggregator\ConfigAggregator;
use Laminas\ServiceManager\ServiceManager;

$config = (new ConfigAggregator([
    ConfigProvider::class,
]))->getMergedConfig();

$dependencies = $config['dependencies'];

$container = new ServiceManager($dependencies);

/** @var StorageAdapterFactoryInterface $storageFactory */
$storageFactory = $container->get(StorageAdapterFactoryInterface::class);

$storage = $storageFactory->create(Memory::class);

$storage->setItem('foo', 'bar');

Benchmarks

We provide scripts for benchmarking laminas-cache using the PHPBench framework; these can be found in the benchmark/ directory.

To execute the benchmarks you can run the following command:

$ vendor/bin/phpbench run --report=aggregate
Comments
  • Component split

    Component split

    I would like to get your opinions about splitting zend-cache into different components. The reason for that is simply a testing and dependency hell.

    • It's not possible to define a required extension in composer.json so all adapters have to manually check if the current environment is matching the requirements
    • Testing against all adapters is a nightmare and takes very long.
      • The travis.yml file al already very complex but it still doesn't test all common cases.
      • Some extensions are missing or not 100% compatible for PHP-7 which makes things here more complicated.
      • Doesn't test against different (most common) extension versions
      • Nearly impossible to run tests for ZendServer adapters
    • another reason is that normally you only need 1 or 2 adapters but that's not very important as zend-cache doesn't install so many files per adapter.

    In my opinion it makes sense to split parts into it's own repository as long as the part requires a non standard extension or another currently optional dependency.

    Thoughts ?

    This is a structure how this could look like:

    zendframework/zend-cache

    • Exceptions
    • Patterns
    • Service
    • Factories
    • Storage Interfaces
    • Storage Plugins
      • all except the Serializer plugin
    • Storage Adapters
      • BlackHole
      • Filesystem
      • Memory

    zendframework/zend-cache-serializer

    • adds the serializer storage plugin which requires zend-serializer

    zendframework/zend-cache-apc

    • adds the Apc storage adapter requires the apc extension (or compatible extension)

    zendframework/zend-cache-apcu

    • adds the Apcu storage adapter requires the apcu extension

    zendframework/zend-cache-dba

    • adds the Dba storage adapter requires the dba extension

    zendframework/zend-cache-memcache

    • adds the Memcache storage adapter requires the memcache extension

    zendframework/zend-cache-memcached

    • adds the Memcached storage adapter requires the memcached extension

    zendframework/zend-cache-mongo

    • adds the Mongo storage adapter requires the mongo extension
    • It's currently the MongoDb adapter but there is also another extension called mongodb

    zendframework/zend-cache-redis

    • adds the Redis storage adapter requires the redis extension

    zendframework/zend-cache-session

    • adds the Session storage adapter requires the zend-session

    zendframework/zend-cache-wincache

    • adds the WinCache storage adapter requires the wincache extension

    zendframework/zend-cache-xcache

    • adds the XCache storage adapter requires the xcache extension

    zendframework/zend-cache-zendserver

    • adds the ZendDataCacheDisk and ZendDataCacheShm storage adapter requires the zend data cache extension
    • This is currently called ZendServerDisk / ZendServerShm because the extension is part of Zend Server

    Originally posted by @marc-mabe at https://github.com/zendframework/zend-cache/issues/93

    Question 
    opened by weierophinney 16
  • Regular Expression to validate key length leads to compilation error

    Regular Expression to validate key length leads to compilation error

    \Laminas\Cache\Storage\Adapter\Redis was upgraded to have maxKeyLength capability based on the server version. It now indicates 512000000

    When using a SimpleCacheDecorator with this kind of adapter the validateKey method will generate PHP warning because of the way the key length is done.

    preg_match(): Compilation failed: number too big in {} quantifier at offset 9").
    
    Bug 
    opened by 10n 11
  • PHP 8.0 support for v2

    PHP 8.0 support for v2

    Hi, since we need all satellite packages to be ready before releasing PHP 8 support for laminas-cache v2, here's the packages involved to ease track of progress:

    Maintained

    Abandoned

    • laminas-cache-storage-adapter-apc
    • laminas-cache-storage-adapter-dba
    • laminas-cache-storage-adapter-mongodb
    • laminas-cache-storage-adapter-wincache
    • laminas-cache-storage-adapter-xcache
    • laminas-cache-storage-adapter-zend-server
    Work In Progress 
    opened by Slamdunk 10
  • Allow installation on PHP 8.1

    Allow installation on PHP 8.1

    | Q | A |-------------- | ------ | Documentation | no | Bugfix | no | BC Break | no | New Feature | no | RFC | no | QA | no

    Description

    Allow installation on PHP 8.1 for 2.13.x version.

    Won't Fix 
    opened by cedric-anne 9
  • Migration to PHP 8.0 with replace leads to unexpected errors

    Migration to PHP 8.0 with replace leads to unexpected errors

    The instruction worked for most of our projects. But there was one project, which depended on multiple projects in which the replacement was done.

    Adding replaces in the main project composer will throw the following error:

    [root@ffc765ad176a html]# php -d memory_limit=8G composer.phar -W update
    Loading composer repositories with package information
    In Laminas\DependencyPlugin\DependencyRewriterV2::onPrePoolCreate
    Updating dependencies
    Your requirements could not be resolved to an installable set of packages.
    
      Problem 1
        - vendor/main-project is present at version dev-master and cannot be modified by Composer
        - Root composer.json requires vendor/sub-project-1 ^1.5 -> satisfiable by vendor/sub-project-1[v1.5.0].
        - vendor/sub-project-2[v1.4.0], vendor/sub-project-1[v1.5.0] cannot be installed as that would require removing vendor/main-project[dev-master]. They all replace laminas/laminas-cache-storage-adapter-apc and thus cannot coexist.
        - Root composer.json requires vendor/sub-project-2 ^1.4 -> satisfiable by vendor/sub-project-2[v1.4.0].
    
    Use the option --with-all-dependencies (-W) to allow upgrades, downgrades and removals for packages currently locked to specific versions.
    

    Without the replaces in the main project the following errors are thrown:

    [root@ffc765ad176a html]# php -d memory_limit=8G composer.phar -W update
    Loading composer repositories with package information
    In Laminas\DependencyPlugin\DependencyRewriterV2::onPrePoolCreate
    Updating dependencies
    Your requirements could not be resolved to an installable set of packages.
    
      Problem 1
        - Root composer.json requires vendor/sub-project-1 ^1.5 -> satisfiable by vendor/sub-project-1[v1.5.0].
        - Only one of these can be installed: laminas/laminas-cache-storage-adapter-zend-server[1.0.0, 1.0.1], vendor/sub-project-2[v1.4.0], vendor/sub-project-1[v1.5.0]. [vendor/sub-project-2, vendor/sub-project-1] replace laminas/laminas-cache-storage-adapter-zend-server and thus cannot coexist with it.
        - Root composer.json requires vendor/sub-project-2 ^1.4 -> satisfiable by vendor/sub-project-2[v1.4.0].
    
    Use the option --with-all-dependencies (-W) to allow upgrades, downgrades and removals for packages currently locked to specific versions.
    

    Do you have any hints/ideas how we could circumnavigate this issue? Would an "archived-projects" composer package which replaces all archived repos and require this in all the subprojects do the trick? Are there any easier methods?

    Originally posted by @plorenz-etes in https://github.com/laminas/laminas-cache/issues/88#issuecomment-964236408

    Question 
    opened by boesing 8
  • Removal of abandoned storage adapter from documentation

    Removal of abandoned storage adapter from documentation

    Feature Request

    | Q | A |------------ | ------ | Documentation | yes

    Summary

    With the Technical Steering Committee Meeting in May 2021, we decided to abandon some cache adapters for several reasons.

    Components are already archived and thus wont receive any new releases.

    The only thing what is missing: Documentation removal of these components.

    We can do this with v3 while keeping documentation for v2. This would require us to provide versionized documentation for this component which is actually unavailable. I think I need guidance by @froschdesign or @weierophinney to make that happen.

    Documentation Enhancement RFC 
    opened by boesing 8
  • Mark `ClassCache` pattern as deprecated

    Mark `ClassCache` pattern as deprecated

    | Q | A |-------------- | ------ | QA | yes

    Description

    As recommended by @marc-mabe in #107, we mark the ClassCache as deprecated as of v2.12.

    Documentation Enhancement 
    opened by boesing 7
  • CallbackCache: simplify calling function/method

    CallbackCache: simplify calling function/method

    | Q | A |-------------- | ------ | Documentation | no | Bugfix | no | BC Break | no | New Feature | no | RFC | no | QA | yes

    Description

    Simplified calling the underlying function/method of CallbackCache (and ObjectCache and ClassCache)

    Enhancement 
    opened by marc-mabe 7
  • PHP 8.1.1 support

    PHP 8.1.1 support

    Feature Request

    Could you please support the latest PHP version - 8.1.1? Unable to install the component while running PHP 8.1.1

    composer require laminas/laminas-cache
    
    Problem 1
       - laminas/laminas-servicemanager 3.7.0 requires php ^7.3 || ~8.0.0 -> your php version (8.1.1) does not satisfy that requirement.
       - laminas/laminas-servicemanager[3.8.0, ..., 3.10.0] require psr/container ^1.0 -> found psr/container[1.0.0, 1.1.0, 1.1.1, 1.1.2] but the package is fixed to 2.0.2 (lock file version) by a partial update and that version does not match. Make sure you list it as an argument for the update command.
       - laminas/laminas-cache[3.1.0, ..., 3.1.2] require laminas/laminas-servicemanager ^3.7 -> satisfiable by laminas/laminas-servicemanager[3.7.0, 3.8.0, 3.9.0, 3.10.0].
       - Root composer.json requires laminas/laminas-cache ^3.1 -> satisfiable by laminas/laminas-cache[3.1.0, 3.1.1, 3.1.2].
    
    Use the option --with-all-dependencies (-W) to allow upgrades, downgrades and removals for packages currently locked to specific versions.
    You can also try re-running composer require with an explicit version constraint, e.g. "composer require laminas/laminas-cache:*" to figure out if any version is installable, or "composer require laminas/laminas-cache:^2.1" if you know which you need.
    
    Question 
    opened by srakhmanchuk 6
  • Version 3 should be useable without specific DI container

    Version 3 should be useable without specific DI container

    Feature Request

    This library should be usable standalone when attempting to create instances of caching objects.

    | Q | A |------------ | ------ | New Feature | yes | RFC | yes | BC Break | no

    Summary

    The static factories StorageFactory and PatternFactory are deprecated in the latest V2.12, however their use case does not seem to be recreated properly in alternative methods.

    The way I think I'm supposed to consume this library in V3 is that I have to use either Mezzio or Laminas MVC because they provide a means to consume the output of the ConfigProvider class - which is very Laminas-specific configuration code that will not run on its own or explain by itself what has to be done in order to create a class that is able to do caching.

    My use case: I have multiple applications, which use about any possible DI container, for example PHP-DI, Pimple or Laminas. I cannot rule out homebrew solutions as well, and possibly no DI in very old applications.

    These applications have access to quite a number of libraries that access HTTP-based services (SOAP and REST), so caching them is one required feature. And each of these library has a static factory call that anybody can use to get a working instance of the service client. I intentionally did not want to tie these libraries into any DI container, i.e. I am unable to "just use one DI everywhere", so instead I opted for an interface that any DI container is able to access.

    Going one step deeper, these client factories have to include the caching layer, and for that they are calling another static factory of mine, that is eventually calling the StorageFactory mentioned above. This acts mostly as a convenience layer.

    I would be able to add any dependency injection required for Laminas to build StorageInterface instances in the future, however I have no clue how to do this without being required to effectively grab quite an amount of otherwise unused dependencies unrelated to the task, build one of the mentioned DI containers by injecting the configuration, and then get a working instance. Something that used to be a simple static call with some carefully prepared configuration array.

    I do understand removing legacy waste is an issue, and I have no intention of reverting the deprecation, but there is some information gap right now, and maybe functionality gap as well.

    Currently I cannot "inject StorageAdapterFactoryInterface" because the implementing class StorageAdapterFactory requires two dependencies, both of them having non-trivial constructor parameters themselves.

    The StorageAdapterFactoryFactory also doesn't help because it requires a properly configured container.

    RFC 
    opened by SvenRtbg 6
  • Require `mbstring` with v3

    Require `mbstring` with v3

    Feature Request

    | Q | A |------------ | ------ | New Feature | yes | BC Break | yes

    Summary

    As this library supports PSR-6 and PSR-16, it also needs ways to handle multibyte strings which are allowed as per these recommendations. To fix #154 properly, a multibyte check needs to be done when a key exceeds a certain limit. This is actually only the case for the redis adapter, so until v3, the redis adapter will decrease its maximum key length to 65534 as 65535 is the maximum number to be used as a specifier for pcre2.

    https://3v4l.org/GURWn

    Enhancement Won't Fix 
    opened by boesing 6
  • Lock file maintenance

    Lock file maintenance

    Mend Renovate

    This PR contains the following updates:

    | Update | Change | |---|---| | lockFileMaintenance | All locks refreshed |


    ⚠ Dependency Lookup Warnings ⚠

    Warnings were logged while processing this repo. Please check the Dependency Dashboard for more information.

    🔧 This Pull Request updates lock files to use the latest dependency versions.


    Configuration

    📅 Schedule: Branch creation - "before 2am" in timezone UTC, Automerge - At any time (no schedule defined).

    🚦 Automerge: Enabled.

    Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

    👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.


    • [ ] If you want to rebase/retry this PR, check this box

    Read more information about the use of Renovate Bot within Laminas.

    renovate 
    opened by renovate[bot] 0
  • Update dependency psr/cache to v3

    Update dependency psr/cache to v3

    Mend Renovate

    This PR contains the following updates:

    | Package | Type | Update | Change | |---|---|---|---| | psr/cache | require | major | ^1.0 -> ^1.0 \|\| ^3.0 |


    ⚠ Dependency Lookup Warnings ⚠

    Warnings were logged while processing this repo. Please check the Dependency Dashboard for more information.


    Release Notes

    php-fig/cache

    v3.0.0

    Compare Source

    Changed
    • BREAKING All methods have return types

    v2.0.0

    Compare Source

    Changed
    • BREAKING The CacheItemInterface::expiresAt() method’s $expiration parameter is typehinted with DateTimeInterface, see this explanation
    • All methods have typed parameters
    • Psr\Cache\CacheException extends Throwable
    • Bump required PHP version to 8.0

    Configuration

    📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

    🔕 Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    Read more information about the use of Renovate Bot within Laminas.

    renovate 
    opened by renovate[bot] 0
  • Update dependency psr/simple-cache to v3

    Update dependency psr/simple-cache to v3

    Mend Renovate

    This PR contains the following updates:

    | Package | Type | Update | Change | |---|---|---|---| | psr/simple-cache | require | major | ^1.0 -> ^1.0 \|\| ^3.0 |


    ⚠ Dependency Lookup Warnings ⚠

    Warnings were logged while processing this repo. Please check the Dependency Dashboard for more information.


    Release Notes

    php-fig/simple-cache

    v3.0.0

    Compare Source

    • Adds return types

    See the meta doc, section Errata for more details: https://www.php-fig.org/psr/psr-16/meta/

    v2.0.0

    Compare Source

    • Adds parameter types
    • Makes CacheException extend \Throwable
    • Requires PHP 8

    See the meta doc, section Errata for more details: https://www.php-fig.org/psr/psr-16/meta/


    Configuration

    📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

    🔕 Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    Read more information about the use of Renovate Bot within Laminas.

    renovate 
    opened by renovate[bot] 0
  • Dependency Dashboard

    Dependency Dashboard

    This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.


    ⚠ Dependency Lookup Warnings ⚠

    • Renovate failed to look up the following dependencies: laminas/laminas-cache-storage-implementation.

    Files affected: composer.json


    Open

    These updates have all been created already. Click a checkbox below to force a retry/rebase of any.

    Detected dependencies

    composer
    composer.json
    • php ~8.0.0 || ~8.1.0 || ~8.2.0
    • laminas/laminas-cache-storage-implementation 1.0
    • laminas/laminas-eventmanager ^3.4
    • laminas/laminas-servicemanager ^3.11.1
    • laminas/laminas-stdlib ^3.6
    • psr/cache ^1.0
    • psr/simple-cache ^1.0
    • stella-maris/clock ^0.1.5
    • webmozart/assert ^1.9
    • laminas/laminas-cache-storage-adapter-apcu ^2.0
    • laminas/laminas-cache-storage-adapter-blackhole ^2.0
    • laminas/laminas-cache-storage-adapter-filesystem ^2.0
    • laminas/laminas-cache-storage-adapter-memory ^2.0
    • laminas/laminas-cache-storage-adapter-test ^2.3
    • laminas/laminas-cli ^1.0
    • laminas/laminas-coding-standard ~2.5.0
    • laminas/laminas-config-aggregator ^1.5
    • laminas/laminas-feed ^2.14
    • laminas/laminas-serializer ^2.6.1
    • phpbench/phpbench ^1.0
    • phpunit/phpunit ^9.5.23
    • psalm/plugin-phpunit ^0.18.0
    • vimeo/psalm ^5.0
    github-actions
    .github/workflows/continuous-integration.yml
    .github/workflows/docs-build.yml
    .github/workflows/release-on-milestone-closed.yml

    • [ ] Check this box to trigger a request for Renovate to run again on this repository
    opened by renovate[bot] 0
  • RFC: Configure AdapterPluginManager from the config

    RFC: Configure AdapterPluginManager from the config

    RFC

    | Q | A | | ------------------- | ------ | | Proposed Version(s) | x.y.0 | | BC Break? | No |

    Goal

    Configure AdapterPluginManager from the config.

    Background

    Every other service manager laminas provides does have a dedicated configuration key (such as validators) but the AdapterPluginManager component never had such configuration key.

    Considerations

    With this feature we would provide users writing custom cache storage adapters a familiar way of configuring AdapterPluginManager while not having to write dedicated delegators.

    We also do not need to update the various laminas/laminas-cache-storage-adapter-XXX repositories. As @boesing mentioned in https://discourse.laminas.dev/t/configure-storageadapterfactory-from-the-config/2918/4 Laminas ensures internally that the vendor adapters are correctly configured using psalm type annotations.

    Proposal(s)

    Declare a storage_adapters key in the application config and read it in StorageAdapterPluginManagerFactory to initialize the AdapterPluginManager.

    
    final class AdapterPluginManager extends AbstractPluginManager
    {
        public const CONFIGURATION_KEY = 'storage_adapters';
    
        /**
         * Do not share by default
         *
         * @var bool
         */
        protected $sharedByDefault = false;
    
        /** @var string */
        protected $instanceOf = StorageInterface::class;
    }
    
    final class StorageAdapterPluginManagerFactory
    {
        public function __invoke(ContainerInterface $container): AdapterPluginManager
        {
            $config = $container->get('config')[AdapterPluginManager::CONFIGURATION_KEY] ?? [];
            return new AdapterPluginManager($container, $config);
        }
    }
    
    RFC 
    opened by rohm1 9
Releases(3.9.0)
Owner
Laminas Project
Laminas components and MVC.
Laminas Project
DataLoaderPhp is a generic utility to be used as part of your application's data fetching layer to provide a simplified and consistent API over various remote data sources such as databases or web services via batching and caching.

DataLoaderPHP is a generic utility to be used as part of your application's data fetching layer to provide a simplified and consistent API over various remote data sources such as databases or web services via batching and caching.

Webedia - Overblog 185 Nov 3, 2022
A thin PSR-6 cache wrapper with a generic interface to various caching backends emphasising cache tagging and indexing.

Apix Cache, cache-tagging for PHP Apix Cache is a generic and thin cache wrapper with a PSR-6 interface to various caching backends and emphasising ca

Apix 111 Nov 26, 2022
Yii Caching Library - Redis Handler

Yii Caching Library - Redis Handler This package provides the Redis handler and implements PSR-16 cache. Requirements PHP 7.4 or higher. Installation

Yii Software 4 Oct 9, 2022
Query caching for Laravel

Query caching for Laravel

Dwight Watson 1k Dec 30, 2022
Simple Yet Powerful PHP Caching Class

The PHP high-performance object caching system ever. phpFastCache is a high-performance, distributed object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load. phpFastCache dropped the database load to almost nothing, yielding faster page load times for users, better resource utilization. It is simple yet powerful

Khoa Bui 28 Aug 19, 2022
Stash - A PHP Caching Library

Stash - A PHP Caching Library Stash makes it easy to speed up your code by caching the results of expensive functions or code. Certain actions, like d

Tedious Developments 943 Dec 15, 2022
Caching extension for the Intervention Image Class

Intervention Image Cache extends the Intervention Image Class package to be capable of image caching functionality.

null 616 Dec 30, 2022
Stash makes it easy to speed up your code by caching the results of expensive functions or code

Stash - A PHP Caching Library Stash makes it easy to speed up your code by caching the results of expensive functions or code. Certain actions, like d

Tedious Developments 943 Dec 15, 2022
The next-generation caching layer for PHP

The next-generation caching layer for PHP

CacheWerk 115 Dec 25, 2022
Symfony Bundle for the Stash Caching Library

TedivmStashBundle The TedivmStashBundle integrates the Stash caching library into Symfony, providing a powerful abstraction for a range of caching eng

Tedious Developments 86 Aug 9, 2022
The cache component provides a Promise-based CacheInterface and an in-memory ArrayCache implementation of that

Cache Async, Promise-based cache interface for ReactPHP. The cache component provides a Promise-based CacheInterface and an in-memory ArrayCache imple

ReactPHP 330 Dec 6, 2022
LRU Cache implementation in PHP

PHP LRU Cache implementation Intro WTF is a LRU Cache? LRU stands for Least Recently Used. It's a type of cache that usually has a fixed capacity and

Rogério Vicente 61 Jun 23, 2022
PSR-6 cache implementation adapting a given PSR-16 instance

PSR-6 cache implementation adapting PSR-16 This package provides a PSR-6 cache instance when you only have a PSR-16 cache at hand. As PSR-6 is more fe

null 1 Oct 15, 2021
Distributed PSR-16 cache implementation for PHP 6 that uses browser cookies to store data

cookiecache Cache beyond the edge with cookies! This library provides a distributed PSR-16 compatible cache implementation for PHP 6 that uses browser

Colin O'Dell 8 Apr 19, 2022
PHP cache implementation supporting memcached

php cache implementation (PSR-6 and PSR-16) Support for memcached and APCu is included. Memcached $memcached = new Memcached(); $memcached->addServer(

Michael Bretterklieber 1 Aug 11, 2022
CLI App and library to manage apc & opcache.

CacheTool - Manage cache in the CLI CacheTool allows you to work with APCu, OPcache, and the file status cache through the CLI. It will connect to a F

Samuel Gordalina 1.4k Jan 3, 2023
PHP cache library, with adapters for e.g. Memcached, Redis, Couchbase, APC(u), SQL and additional capabilities (e.g. transactions, stampede protection) built on top.

Donate/Support: Documentation: https://www.scrapbook.cash - API reference: https://docs.scrapbook.cash Table of contents Installation & usage Adapters

Matthias Mullie 295 Nov 28, 2022
A flexible and feature-complete Redis client for PHP.

Predis A flexible and feature-complete Redis client for PHP 7.2 and newer. ATTENTION: you are on the README file of an unstable branch of Predis speci

Predis 7.3k Jan 3, 2023