Everyone has probably already seen every caching class there ever was and ever will be. However, when I was searching for a class that could easily be switched from one data store to the next I couldn't find a thing. Every caching class I seemed to come by was written specifically for a single back end and with their predefined static keys/column names. Well, those silly restrictions have come to an end!
I present to you the Extensible PHP Caching Library (Hosted at GitHub) - This collection of classes makes it easy to customize key or column names to your needs as well as switch from one data store to another. This extensibility is baked into the core of the library via an abstract class. This abstract Cache class takes an associative array of keys/columns and determines how to use those keys based on the type of cache back end you are using. For example: Suppose you are using a RDBMS such as MySQL. In this case the associative array will be parsed and the query built such that the key is the column name and the value is what you want to query on. However, if you chose to use a NoSQL key/value store such as Memcache then the associative array is sorted and imploded to create a single string as the key.
Since we always specify the key as an associative array, switching between different data stores is as simple as changing the Class name from say MCache to SQLCache in your code. Nothing else is required to change data stores. Keys, expiration dates, and data processing all stay the same and all functions are called with the same arguments. This functionality is attributed to the abstract base Cache class which guides and regulates the inheriting classes.
Lets get to some examples:
In the following example we create a new SQLCache object and pass it our associative array of keys and values. Check if there is cached data, if there isnt then do something to generate the data and then cache it. Notice how you dont have to pass the key in again when setting the cache. The key is stored within the object so you can get and set as many times as you need without having to set the key every time. Lastly we delete the cache.
// Get Cache $cache = new SQLCache(array('column1' => 123, 'column2' => 'blah', … )); $output = $cache->getCache(); if(!$output) { // Do something to generate data $output = 'some datas'; // Set Cache if($cacheNow) { // Force a write to cache now $cache->setCache($output, '+1 day', true); } else { // Setting no time defaults to time() + 86400, one day from now. $cache->setCache($output); } } print $output; // Delete the cache $cache->deleteCache();
If ever you needed to update this caching strategy to include Memcached the only change would be to change SQLCache to Mcache:
$cache = new SQLCache(array('column1' => 123, 'column2' => 'blah', … )); to $cache = new MCache(array('key1' => 123, 'key2' => 'blah', … ));
The column and key names are arbitrary and may be set to anything you want to name it. For SQL caches make sure you create a cache table that has the corresponding column names and that they are indexed optimally.
While I have only created classes for SQL (MySQL - since there is a LIMIT 1), Memcached and File based caching, the base class can be extended to include any key/value store or any database with columns (MongoDB, CouchDB, Tokyo, Postgress, Oracle, etc). Just update the back end calls and you are good to go.
For anyone who updates or adds functionality please let me know so I can give credit where credit is due. This library is available under the LGPLv3.