icanboogie/storage defines an API to store and retrieve values, while offering different storage backends.
Values can be stored using the runtime memory, Redis, APC, the file system… Storage collections retrieve and store values using multiple different storage instances, that usually range from the less expensive (and the more volatile) to the more expensive (and the more durable).
This package includes the following storage backends:
- RunTimeStorage: Uses a PHP array.
- RedisStorage: Uses a Redis instance.
- APCStorage: Uses APC or APCu.
- FileStorage: Uses the file system.
- StorageCollection: Uses a collection of storage.
composer require icanboogie/storage
A storage is used to store a value and retrieve it later. A unique key is used to identify the value. Different storage store values using different mechanisms, and sometimes for a different period of time. It's always a good idea to choose the storage that best fits a situation, according to the persistence requirement and the expensiveness of the storage.
Note: Storage classes implement the Storage interface, including the StorageCollection class.
<?php
use ICanBoogie\Storage\RunTimeStorage;
$storage = new RunTimeStorage;
$storage->exists('icanboogie'); // false
$storage->retrieve('icanboogie'); // null
$storage->store('icanboogie', "Yes Sir, I Can Boogie");
$storage->retrieve('icanboogie'); // "Yes Sir, I Can Boogie"
$storage->eliminate('icanboogie');
$storage->exists('icanboogie'); // false
$storage->retrieve('icanboogie'); // null
The Time To Live (TTL) of an item is the amount of seconds between when that item is stored and it is considered stale.
Warning:
apc.use_request_time
needs to be set tofalse
if you want to use that feature with APCU.
<?php
use ICanBoogie\Storage\RunTimeStorage;
$storage = new RunTimeStorage;
$storage->store('icanboogie', "Yes Sir, I Can Boogie", $ttl = 3);
$storage->retrieve('icanboogie'); // "Yes Sir, I Can Boogie"
sleep(4);
$storage->exists('icanboogie'); // false
$storage->retrieve('icanboogie'); // null
Storage implements the ArrayAccess
interface and may be accessed as arrays.
<?php
use ICanBoogie\Storage\RunTimeStorage;
$storage = new RunTimeStorage;
isset($storage['icanboogie']); // false
$storage['icanboogie']; // null
$storage['icanboogie'] = "Yes Sir, I Can Boogie";
$storage['icanboogie']; // "Yes Sir, I Can Boogie"
unset($storage['icanboogie']);
isset($storage['icanboogie']); // false
$storage['icanboogie']; // null
Storage implements the IteratorAggregate
interface and may be used in a foreach
to
iterate their keys:
<?php
$storage['one'] = 1;
$storage['two'] = 2;
$storage['three'] = 3;
foreach ($storage as $key)
{
echo "defined: $key\n";
}
defined: one
defined: two
defined: three
The FileStorage storage uses adapters to write and read data written to the filesystem. Any class implementing the Adapter interface can be used, the following are provided with the package:
-
SerializeAdapter: Uses
serialize()
andunserialize()
to encode and decode data. It is used by default. -
JSONAdapter: Uses
json_encode()
andjson_decode()
to encode and decode data. -
PHPAdapter: Uses
var_export()
andrequire
to encode and read data.
When implementing caches, it's always a good idea to use a collection of Storage instances that range from the less expensive (and the more volatile) to the more expensive (and the more durable).
The following example demonstrates how a storage collection can be created with multiple storage instances:
<?php
use ICanBoogie\Storage\StorageCollection;
use ICanBoogie\Storage\RunTimeStorage;
use ICanBoogie\Storage\APCStorage;
use ICanBoogie\Storage\RedisStorage;
use ICanBoogie\Storage\FileStorage;
$storage = new StorageCollection([
new RunTimeStorage,
new APCStorage('my-prefix'),
new RedisStorage($redis_client, 'my-prefix'),
new FileStorage('/path/to/directory')
]);
All the storage instances in the collection are updated by the store()
, eliminate()
,
and clear()
methods. Storage instances are also updated when values are retrieved from
more expensive storages, so that the next time the value is requested it is retrieved from
a less expensive storage.
The Cache interface and CacheCollection class implement a subset of the Storage interface and StorageCollection class, they only provide read-only features.
APCStorage::is_available()
may be used to check if APC is available.
The project is continuously tested by GitHub actions.
This project adheres to a Contributor Code of Conduct. By participating in this project and its community, you're expected to uphold this code.
See CONTRIBUTING for details.