A thin PSR-6 cache wrapper with a generic interface to various caching backends emphasising cache tagging and indexing.

Overview

Apix Cache, cache-tagging for PHP Build Status

Latest Stable Version Total Downloads Build Status Code Quality Code Coverage License

Apix Cache is a generic and thin cache wrapper with a PSR-6 interface to various caching backends and emphasising cache tagging and indexing.

Cache-tagging allows to find/update all data items with one or more given tags. Providing, for instance, a batch delete of all obsolete entries matching a speficic tag such as a version string.

  • Fully unit-tested and compliant with PSR-1, PSR-2, PSR-4 and PSR-6 (Cache).
  • Continuously integrated
    • against PHP 5.3, 5.4, 5.5, 5.6, 7.0, 7.1, 7.2, 7.3 and HHVM,
    • and against APC, APCu, Redis, MongoDB, Sqlite, MySQL, PgSQL and Memcached, ...
    • supports a range of serializers: igBinary, msgpack, json, php, ...
  • Extendable, additional extensions are available:
    • apix/simple-cache provides a SimpleCache (PSR-16) interface.
    • More contributions will be linked here.
  • Available as a Composer and as a PEAR package.

Pull requests and ★ Stars are always welcome. For bugs and feature request, please create an issue.


Cache backends

Currently, the following cache store are supplied:

Factory usage (PSR-Cache wrapper)

  use Apix\Cache;

  $backend = new \Redis();
  #$backend = new \PDO('sqlite:...');    // Any supported client object e.g. Memcached, MongoClient, ...
  #$backend = new Cache\Files($options); // or one that implements Apix\Cache\Adapter
  #$backend = 'apcu';                    // or an adapter name (string) e.g. "APC", "Runtime"
  #$backend = new MyArrayObject();       // or even a plain array() or \ArrayObject.

  $cache = Cache\Factory::getPool($backend);             // without tagging support
  #$cache = Cache\Factory::getTaggablePool($backend);    // with tagging
  
  $item = $cache->getItem('wibble_id');
  
  if ( !$cache->isHit() ) {
    $data = compute_expensive_stuff();
    $item->set($data);
    $cache->save($item);
  }

  return $item->get();

Basic usage (Apix native)

  use Apix\Cache;

  $cache = new Cache\Apcu;

  // try to retrieve 'wibble_id' from the cache
  if ( !$data = $cache->load('wibble_id') ) {
    
    // otherwise, get some data from the origin
    // example of arbitrary mixed data
    $data = array('foo' => 'bar');

    // and save it to the cache
    $cache->save($data, 'wibble_id');
  }

You can also use the folowing in your use cases:

  // save $data to the cache as 'wobble_id',
  // tagging it along the way as 'baz' and 'flob',
  // and set the ttl to 300 seconds (5 minutes)
  $cache->save($data, 'wobble_id', array('baz', 'flob'), 300);

  // retrieve all the cache ids under the tag 'baz'
  $ids = $cache->loadTag('baz');

  // clear out all items with a 'baz' tag
  $cache->clean('baz');

  // remove the named item
  $cache->delete('wibble_id');

  // flush out the cache (of all -your- stored items)
  $cache->flush();

Advanced usage

Options shared by all the backends

  use Apix\Cache;
  
  // default options
  $options = array(
      'prefix_key'  => 'apix-cache-key:', // prefix cache keys
      'prefix_tag'  => 'apix-cache-tag:', // prefix cache tags
      'tag_enable'  => true               // wether to enable tags support
  );

  // start APCu as a local cache
  $local_cache = new Cache\Apcu($options);

Redis specific

  // additional (default) options
  $options['atomicity']  = false;   // false is faster, true is guaranteed
  $options['serializer'] = 'php';   // null, php, igbinary, json and msgpack

  $redis_client = new \Redis;       // instantiate phpredis*
  $distributed_cache = new Cache\Redis($redis_client, $options);

* see PhpRedis for instantiation usage.

Memcached specific

  // additional (default) options, specific to Memcached
  $options['prefix_key'] = 'key_';  // prefix cache keys
  $options['prefix_tag'] = 'tag_';  // prefix cache tags
  $options['prefix_idx'] = 'idx_';  // prefix cache indexes
  $options['prefix_nsp'] = 'nsp_';  // prefix cache namespaces
  $options['serializer'] = 'auto';  // auto, igbinary, msgpack, php, json and json_array.

  $memcached  = new \Memcached;     // a Memcached*** instance
  $shared_cache = new Cache\Memcached($memcached, $options);

The serialzer auto (default) is igBinary if available, then msgpack if available, then php otherwise.

*** see Memcached for instantiation details.

MongoDB specific

  // additional (default) options
  $options['object_serializer'] = 'php';  // null, json, php, igBinary
  $options['db_name'] = 'apix';           // name of the mongo db
  $options['collection_name'] = 'cache';  // name of the mongo collection

  $mongo  = new \MongoDB\Client;          // MongoDB native driver
  #$mongo  = new \MongoClient;            // or MongoDB legacy driver
  $cache = new Cache\Mongo($mongo, $options);

PDO specific

  // additional (default) options, specific to the PDO backends
  $options['db_table']   = 'cache';       // table to hold the cache
  $options['serializer'] = 'php';         // null, php, igbinary, json and msgpack
  $options['preflight']  = true;          // wether to preflight the DB
  $options['timestamp']  = 'Y-m-d H:i:s'; // the timestamp DB format

  // with SQLITE
  $dbh = new \PDO('sqlite:/tmp/apix_tests.sqlite3');
  $relational_cache = new Cache\Pdo\Sqlite($dbh, $options);

  // with MYSQL, MariaDB and Percona
  $dbh = new \PDO('mysql:host=xxx;port=xxx;dbname=xxx', 'user', 'pass');
  $mysql_cache = new Cache\Pdo\Mysql($dbh, $options);

  // with PGSQL
  $dbh = new \PDO('pgsql:dbname=xxx;host=xxx', 'xxx', 'xxx');
  $postgres_cache = new Cache\Pdo\Pgsql($dbh, $options);

  // with a SQL:1999 compliant DB, e.g. Oracle
  $dbh = new \PDO('oci:dbname=xxx', 'xxx', 'xxx');
  $sql1999_cache = new Cache\Pdo\Sql1999($dbh, $options);

The preflight option will create on-the-fly the required tables if these are mssing. Once these tables exist, set preflight to false in order to avoid the extraneous checks.

Filesystem specific

  // additional (default) options
  $options['directory'] = sys_get_temp_dir() . '/apix-cache'; // Directory where the cache is created
  $options['locking'] = true;                                 // File locking (recommended)
  
  $files_cache = new Cache\Files($options);
  // or
  $directory_cache = new Cache\Directory($options);  
  • Files: the cache metadata (expiration time and tags) are stored in the cache file directly.
  • Directory: the metadata are stored separately from the cached data.

Installation

This project adheres to Semantic Versioning and can be installed using composer:

$ composer require apix/cache:^1.3

All notable changes to this project are documented in its CHANGELOG.

License

This work is licensed under the New BSD license -- see the LICENSE for the full details.
Copyright (c) 2010-2016 Franck Cassedanne

Comments
  • Fix `Files::clean` and `Directory::clean` return to early if failing to find a tag -- with supporting tests

    Fix `Files::clean` and `Directory::clean` return to early if failing to find a tag -- with supporting tests

    What did you implement:

    Implementing tests for PR#17

    How can we verify it:

    $ phpunit --group pr

    Done and todos:

    • [x] Write unit tests,
    • [ ] Write documentation,
    • [ ] Fix linting errors,
    • [x] Make sure code coverage hasn't dropped,
    • [x] Leave a comment that this is ready for review once you've finished the implementation.
    opened by frqnck 10
  • MongoDB - array serialisation of nested keys

    MongoDB - array serialisation of nested keys

    Arrays have to be serialized as well

    After using mongo backend as a storage i came across an issue with arrays as data. When a key in associative array has dots, mongo throws exception:

    MongoCursorException: localhost:27017: The dotted field 'A.B' in 'data.A.B' is not valid for storage.

    Proposed fix

    If input data is array it is serialized same way as in case of an object.

    I also changed how serialized data is stored - there is a new property "serialized" which holds binary data. When data is fetched from the mongo we either de-serialize it, or use raw "data"

    enhancement 
    opened by dimasikturbo 5
  • Build updates to support PHP 7.4

    Build updates to support PHP 7.4

    What did you implement:

    Implementing Issue: #42

    How did you implement it:

    Add PHP 7.4 to php list Move PHP 5.3, 5.4 & 5.5 to allowed to fail list Change Scrutinizer timeout to 20 minutes Minor code changes to support PHP 7.4

    How can we verify it:

    All build variants succeed

    Done and todos:

    • [ ] Write unit tests,
    • [ ] Write documentation,
    • [ ] Fix linting errors,
    • [ x] Make sure code coverage hasn't dropped,
    • [ x] Leave a comment that this is ready for review once you've finished the implementation.
    enhancement 
    opened by BlairCooper 4
  • Modified Redis::flush to delete all keys only from the current DB

    Modified Redis::flush to delete all keys only from the current DB

    What did you implement:

    Redis has a less often used feature to isolate key spaces into up to 16 databases. By default, if not otherwise explicitly set, database 0 is used - which is the normal use-case for most users.

    Apix uses the Redis instance passed in the configuration, with whatever database selected. It does not handle in any way database changes (nor it shouldn't). However, in the flush method, instead of deleting all keys from current db, it empties all redis, even other databases that were out of reach when getting/setting keys using the flushAll method on phpredis. Normally, the flushDb method should be used, which just empties the currently selected db (which is 0 for most users anyway).

    How I reached this conclusion? In our current setup we have set up our session provider to use database 0. And Apix to use database 1. This way using the same Redis instance for both use-cases, while isolating the 2 key-spaces. This works fine, until we do a $pool->clear(); which erases both its keys and all sessions at the same time.

    How can we verify it:

    1. Add keys to both databases 0 and 1
    2. When configuring the Redis instance, after connecting, just do a $redis->select(1); before instantiating the Pool.
    3. Do a clear cache => expectation: only keys in db 1 should be deleted

    Done and todos:

    • [ ] Write unit tests,
    • [ ] Write documentation,
    • [x] Fix linting errors,
    • [x] Make sure code coverage hasn't dropped,
    • [x] Leave a comment that this is ready for review once you've finished the implementation.
    enhancement 
    opened by alexpica 4
  • Please add support for APCu

    Please add support for APCu

    Since APC as a caching engine is no longer supported, please add support for APCu. This could be as simple as cloning your APC class and renaming the methods to apcu_*

    question 
    opened by innobrig 4
  • Issue with update + insert in PDO mysql driver

    Issue with update + insert in PDO mysql driver

    When same data is stored under same key PDO mysql driver return 0 number of updated rows and as a result insert triggers error "SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry"

    MySQL has a special SQL extension INSERT ON DUPLICATE KEY UPDATE which can be used instead of UPDATE + INSERT.

    bug enhancement 
    opened by dimasikturbo 4
  • Fix AbstractPdo::flush() to match Adapter::flush documentation

    Fix AbstractPdo::flush() to match Adapter::flush documentation

    Either delete all of the rows in the cache table or only the rows that start with the key prefix or the tag prefix.

    The previous implementation would drop the cache table which would result in an exception if flush(true) was called and the cache were subsequently read.

    What did you implement:

    Implementing Issue: #40

    How did you implement it:

    Changed the AbstractPdo::flush() method to behave how the documentation for Adapter::flush() says it should. If $all is true then delete the entire table. If $all is false, only delete rows that have a key with the prefix or tags with the prefix.

    How can we verify it:

    Done and todos:

    • [x ] Write unit tests,
    • [ ] Write documentation,
    • [ ] Fix linting errors,
    • [ x] Make sure code coverage hasn't dropped,
    • [ x] Leave a comment that this is ready for review once you've finished the implementation.
    opened by BlairCooper 3
  • Fix: `Files::flush(true)`

    Fix: `Files::flush(true)`

    What did you implement:

    Fixing an issue where the Files::flush method does not work when called with true. Also added test for it.

    Done and todos:

    • [x] Write unit tests,
    • [x] Make sure code coverage hasn't dropped,
    • [x] Leave a comment that this is ready for review once you've finished the implementation.
    bug 
    opened by alexpica 3
  • 'Files' and 'Directory' are not listed as clients in the Factory class

    'Files' and 'Directory' are not listed as clients in the Factory class

    Hello,

    Apparently the 'Files' and 'Directory' clients are not listed in the Factory, thus we cannot instantiate a factory by passing a string like 'files' or 'directory'. Also, the first argument in the implementation of those 2 classes should be an instance of the class itself, otherwise the factory will throw an error.

    Maybe I missed something?!

    Thanks, Regards, Alex

    bug 
    opened by alexpica 3
  • Travis: PHP 5.4 and 5.5 cannot run on Xenial

    Travis: PHP 5.4 and 5.5 cannot run on Xenial

    Have PHP 5.4 and 5.5 builds run on Trusty.

    Fixes #36

    What did you implement:

    Implementing Issue: #36

    How did you implement it:

    Added entries to matrix.include to have PHP versions 5.4 and 5.5 build on Trusty. Corrected entries for 5.3 to build on Pricise Added targets for PHP 7.1, 7.2 and 7.3 Corrected user of continue in switch statement in Memcached.php/setSerializer() (for 7.3 compatibility). WARNING base: PHP Error: {"type":2,"message":""continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?","file":"/nas/content/live/mycpprod/wp-content/plugins/mycp-redcap/vendor/apix/cache/src/Memcached.php","line":242}

    How can we verify it:

    Builds no longer fail. Warning no longer appears on PHP 7.3.

    Done and todos:

    • [ ] Write unit tests,
    • [ ] Write documentation,
    • [ ] Fix linting errors,
    • [ ] Make sure code coverage hasn't dropped,
    • [ ] Leave a comment that this is ready for review once you've finished the implementation.
    opened by BlairCooper 2
  • Fix: `Files::flush(true)` does not work

    Fix: `Files::flush(true)` does not work

    What did you implement:

    Implementing Issue: #1234

    How did you implement it:

    How can we verify it:

    Done and todos:

    • [ ] Write unit tests,
    • [ ] Write documentation,
    • [ ] Fix linting errors,
    • [ ] Make sure code coverage hasn't dropped,
    • [ ] Leave a comment that this is ready for review once you've finished the implementation.
    opened by alexpica 2
  • Uncaught Apix\Cache\PsrCache\InvalidArgumentException: Item key ('test:string') is invalid

    Uncaught Apix\Cache\PsrCache\InvalidArgumentException: Item key ('test:string') is invalid

    Bug Report

    Uncaught Apix\Cache\PsrCache\InvalidArgumentException: Item key ('test:string') is invalid

    Code snippet

    use Apix\Cache;
    
    $backend = new \Redis();
    $backend->connect('localhost');
    $backend->select(1);
    $cache = Cache\Factory::getPool($backend);
    
    $item = $cache->getItem('test:string');
    

    returns:

    PHP Fatal error:  Uncaught Apix\Cache\PsrCache\InvalidArgumentException: Item key ('test:string') is invalid. in 
    ./vendor/apix/cache/src/PsrCache/Item.php:71
    Stack trace:
    #0 /vendor/apix/cache/src/PsrCache/Pool.php(53): Apix\Cache\PsrCache\Item::normalizedKey()
    #1 /test_redis_apix.php(17): Apix\Cache\PsrCache\Pool->getItem()
    #2 {main}
      thrown in /vendor/apix/cache/src/PsrCache/Item.php on line 71
    

    But Redis allowed use this key:

    root@quartz:/etc/redis# redis-cli --version
    redis-cli 6.2.6
    
    root@quartz:/etc/redis# redis-cli
    
    127.0.0.1:6379> set test:string 'foobar'
    OK
    127.0.0.1:6379> get test:string
    "foobar"
    127.0.0.1:6379> 
    

    Also, keys with : recommended by official documentation: https://redis.io/topics/data-types-intro#redis-keys

    Very short keys are often not a good idea. There is little point in writing "u1000flw" as a key if you can instead write "user:1000:followers". The latter is more readable and the added space is minor compared to the space used by the key object itself and the value object. While short keys will obviously consume a bit less memory, your job is to find the right balance.

    More details

    • Apix-cache version: 1.3
    • Operating System: LMDE (based debian 10)
    • PHP Version: 7.4
    • Redis 6.2.6
    opened by KarelWintersky 0
  • Support PHP 7.4

    Support PHP 7.4

    Feature Proposal

    Description

    Add PHP 7.4 to the Travis build and make any code changes necessary to run on PHP 7.4 (while continuing to support currently supported versions of PHP)

    • Apix-cache version: 1.3.x
    • Operating System: any
    • PHP Version: PHP 7.4, 7.3, 7.2, 7.1, 7.0, 5.6, 5.5, 5.4, & 5.3
    opened by BlairCooper 0
  • Travis: HHVM with the new `mongodb` -- extension not compiling

    Travis: HHVM with the new `mongodb` -- extension not compiling

    mongodb extension for HHVM does not currently work with Travis build.

    See: https://travis-ci.org/frqnck/apix-cache/jobs/171382299

    Affects:

    HHVM Version: 3.6.6 Extension: mongodb

    need-help 
    opened by frqnck 0
  • Adding `increment` and `decrement` methods?

    Adding `increment` and `decrement` methods?

    Do you have thoughts about adding a standard "increment" function for the AbstractCache.php in apix-cache? I know that both Redis and Memcached have this function, and its something I need at the moment -- using ->getAdapter()->... Instead. Jonathan

    Adding increment/decrement methods to AbstractCache.php would be useful indeed.

    It would be good to have a base/inhertied implementations generic enough so that backends without dedicated functions would still benefit.

    PDO, Runtime and Filesystem(s) don’t have dedicated (in|de)crementors — the rest do.

    Essentially, a base implementations would be a two steps affair, i.e. retrieve and update/upsert a (numerical) value. The default (in|de)cremental value being 1.

    enhancement need-help proposal 
    opened by frqnck 2
Releases(1.3.0)
  • 1.3.0(May 2, 2017)

    • Fix a PSR-6 expiration issue.
    • Added PsrCache\Item::__toString` method to simplify cached value output.
    • Added PsrCache\Pool::__destruct() method to (garbage collect) magically commit all deferred cached items.
    • Removed all deprecated methods from PsrCache.
    • Various fixes, more unit-tests and some cleanup.
    Source code(tar.gz)
    Source code(zip)
  • 1.2.9(Jan 5, 2017)

    • Fix Files::clean and Directory::clean return to early if failing to find a tag (PR #17 by @melloc01 + relevant tests PR #24).
    • Fix Files::flush(true) the implementation to flush all was missing (PR #25 contrib by @alexpica).
    • Updated to allow patches from php-fig/cache (PR #26 contrib by @vaibhavpandeyvpz).
    • Fix to a deprecated method PsrCache::setExpiration (PR #27 contrib by @damianopetrungaro).
    Source code(tar.gz)
    Source code(zip)
  • 1.2.8(Oct 28, 2016)

    • Added new mongodb extension for PHP 5.4 and higher (contrib by @dimasikturbo) which also supports HHVM 3.9 and higher. The legacy mongo extension is still provided for PHP 5.6 and lower.
    • Set Travis to skip mongodb on HHVM (compilation issue).
    • Fix array serialisation of nested keys with Mongo (contrib by @dimasikturbo).
    Source code(tar.gz)
    Source code(zip)
  • 1.2.7(Jul 20, 2016)

    • Fix the HHVM issues.
    • Fix APC/APCu for both PHP7 and HHVM.
    • Updated .travis (optimisations).
    • Added msgpack to Redis, Memcached and to all the PDO backends.
    • Added 'auto' and 'json_array' to Memcached.
    • Changed Memcached default serializer to auto.
    • Updated README.md.
    • Added some additional unit-tests.
    • Fix issue #15 "Files cache not correctly handling EOL on Windows" (thanks goes to @davybatsalle).
    Source code(tar.gz)
    Source code(zip)
  • 1.2.6(Jul 20, 2016)

    • Fix issue #13 "TaggablePool and Pool overrides prefix_key and prefix_tag options with hardcoded value" (thanks goes to @alexpica).
    • Fix PHP 5.3, using array() instead of the short array syntax [].
    • Marcked as depreciated isSerialized() and testIsSerialized().
    • Added msgpack serializer.
    • Set Travis to skip Memcached on PHP 7.0 (not yet officially supported).
    • Added additional unit-tests, aiming for 100% code coverage.
    Source code(tar.gz)
    Source code(zip)
  • 1.2.5(Jul 20, 2016)

    • Fix issue #12 by adding Files and Directory backends to the Factory class (thanks goes to @alexpica).
    • Added some additional Factory tests.
    Source code(tar.gz)
    Source code(zip)
  • 1.2.4(Jan 6, 2016)

    • Updated PSR-Cache (Draft) to PSR-6 (Accepted).
    • Marked as deprecated: PsrCache::setExpiration, PsrCache::isRegenerating, PsrCache::exists.
    • Added additional unit tests to cover PSR-6.
    • Updated composer.json.
    • Updated README.md.
    • Updated .gitignore.
    • Added file locking option to the filesystem backends (contrib by @MacFJA).
    Source code(tar.gz)
    Source code(zip)
  • 1.2.3(Jan 6, 2016)

  • 1.2.2(Jan 6, 2016)

    • Added a CHANGELOG.md file.
    • Updated PHPUnit to 4.8 version.
    • Dropped PHP 5.3 support.
    • Dropped PEAR support.
    • Refactored .travis.yml tests.
    • Made Travis faster (using Docker containers and skipping allowable failures).
    • Added support to PHP 7.0.
    Source code(tar.gz)
    Source code(zip)
  • 1.2.1(Jan 6, 2016)

    • Added setOption().
    • Updated composer.json.
    • Updated README.md.
    • Added Scrutinizer checks.
    • Merged Scrutinizer Auto-Fixes.
    • Various minor changes.
    Source code(tar.gz)
    Source code(zip)
  • 1.2.0(Oct 4, 2014)

    • Added preflight option to PDO backends.
    • Added PSR-6 Cache support as a factory class.
    • Added Coverall support.
    • Updated README.md.
    • Added APCu support.
    • Added PHP 5.6 and HHVM support.
    • Updated the README.md.
    Source code(tar.gz)
    Source code(zip)
  • 1.1.0(Jan 6, 2016)

  • 1.0.5(Jan 6, 2016)

  • 1.0.4(Jan 6, 2016)

  • 1.0.3(Jan 6, 2016)

  • 1.0.2(Jan 6, 2016)

  • 1.0.1(Jan 6, 2016)

    • Fixed test for Redis with igBinary.
    • Added APC and PhpRedis environments.
    • Added PHP 5.5 support.
    • Fixed .travis.yml.
    • Added additional tests and minor changes.
    • Updated README.md.
    Source code(tar.gz)
    Source code(zip)
  • 1.0.0(Jan 6, 2016)

Owner
Apix
Lean, standards-compliant and well-tested packages to be used in any codebase.
Apix
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
PSR-15 middleware with various cache utilities

middlewares/cache Middleware components with the following cache utilities: CachePrevention Expires Cache Requirements PHP >= 7.2 A PSR-7 http library

Middlewares 15 Oct 25, 2022
Caching implementation with a variety of storage options, as well as codified caching strategies for callbacks, classes, and output

laminas-cache Laminas\Cache provides a general cache system for PHP. The Laminas\Cache component is able to cache different patterns (class, object, o

Laminas Project 69 Jan 7, 2023
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
Simple cache abstraction layer implementing PSR-16

sabre/cache This repository is a simple abstraction layer for key-value caches. It implements PSR-16. If you need a super-simple way to support PSR-16

sabre.io 48 Sep 9, 2022
This is a Symfony bundle that lets you you integrate your PSR-6 compliant cache service with the framework

PSR-6 Cache bundle This is a Symfony bundle that lets you you integrate your PSR-6 compliant cache service with the framework. It lets you cache your

null 43 Oct 7, 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
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
A clean and responsive interface for Zend OPcache information,

A clean and responsive interface for Zend OPcache information, showing statistics, settings and cached files, and providing a real-time update for the information.

Andrew Collington 1.1k Dec 27, 2022
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 simple cache library. Implements different adapters that you can use and change easily by a manager or similar.

Desarolla2 Cache A simple cache library, implementing the PSR-16 standard using immutable objects. Caching is typically used throughout an applicatito

Daniel González 129 Nov 20, 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