====== Cache ======
Moodle 2.4 saw the introduction of the MUC: Moodle Universal Cache. The cache is actually comprised of a number of smaller caches, defined in ''/lib/db/caches.php'' and the ''caches.php'' files of the various plugins (e.g. ''mod/yourmod/db/caches.php'').
See the [[http://docs.moodle.org/dev/Cache_API|Cache API]] and the [[http://docs.moodle.org/dev/Cache_API_-_Quick_reference|Quick reference]]. The most succinct overview is in Moodle's github [[https://github.com/moodle/moodle/tree/master/cache|repo]].
===== How to Use The Cache =====
In your plugin, create a file ''db/caches.php'':
$definitions = array(
'labelcontent' => array(
'mode' => cache_store::MODE_APPLICATION,
'simplekeys' => true, // keys limited to a-zA-Z0-9_ (better performance)
'simpledata' => true, // data type limited to scalar (e.g. strings, integers) or array of scalars
)
);
Now you're ready to use the cache in your code. Use the current language as part of your key:
$cache = cache::make('mod_my_plugin', 'labelcontent');
// Compose the cache key, e.g. based on the instance id of your plugin
$key = current_language() . $id;
if (!$data = $cache->get($key)) {
// Data was not cached yet, so retrieve:
$data = $DB->get_record('mdl_my_plugin_some_table', array('id' => $id));
$cache->set($key, $data);
}
return $data;
===== Invalidate Cache =====
==== Delete Cache by Key ====
To delete a cache, you first have to retrieve the cache, using a ''make'' function ('make' denotes the activity of using a class factory, not the making of a cache). Then, using the cache object, you can call the ''delete'' method.
// Delete the cache, for caching issue with groups
$cache = cache::make('core', 'groupdata');
$cache->delete($enrollment->courseid);
How do you know which id you can use as the parameter for ''cache#delete''? If you created the cache key yourself, then you use that key of course:
$cache->delete(current_language() . $id);
For other cases it looks as though it's defined in the ''lib/db/caches.php'' file. For instance, for groupdata, the definition is:
// Groupings belonging to a course.
// A simple cache designed to replace $GROUPLIB_CACHE->groupings.
// Items are organised by course id and are essentially course records.
'groupdata' => array(
'mode' => cache_store::MODE_APPLICATION,
'simplekeys' => true, // The course id the groupings exist for.
'simpledata' => true, // Array of stdClass objects containing only strings.
'staticacceleration' => true, // Likely there will be a couple of calls to this.
'staticaccelerationsize' => 2, // The original cache used 1, we've increased that to two.
),
==== Invalidate Cache by Definition ====
The other method to delete a cache, is by using the ''cache_helper::invalidate_by_definition'' method:
cache_helper::invalidate_by_definition('core', 'databasemeta', array('dbfamily' => $DB->get_dbfamily()));
If you're ever want to modify the database through your mod's install.php file, you're going to need this helper!