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 Cache API and the Quick reference. The most succinct overview is in Moodle's github repo.
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;
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. ),
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!