Git Product home page Git Product logo

mm_cache's Introduction

mmCache plugin for Wolf CMS

mmCache is a general purpose cache plugin for Wolf CMS. It is useful in caching computationally intensive operations like rendering multi-level menus, which can generate many database requests.

Another case of usage would be fetching some external content from remote server with slow connection.

For obvious reasons, fragment caching should not be applied to any content that contains forms.

Examples

These are examples of mmFragment an mmCache usage. You can copy/paste following code into your Pages, Snippets or Layouts.

1. Output fragment caching

The random number is cached for 20 seconds in this example.

<?php
// check if there is a cached fragment named 'samplefragment'
// if the fragment exists in cache it will be echoed
// if it doesn't exist the inner clause of 'if' statement
// will be executed
// notice the exclamation mark in if statement
if (! mmFragment::load('samplefragment') ) {

// make some output with random number
        echo "Random number to be cached: <strong>" . mt_rand(0, 10000) . "</strong><br/>";

        // save fragment for 20 seconds
        mmFragment::save(20);

        // this text will only show when fragment doesn't exist
        // because we've already stored fragment
        echo "<em>Cache didn't exist. Saved fragment for 20 seconds</em>";
} else { // fragment was found

// the "else" gets executed if fragment is served from cache
// you can omit this part or you can do this: 
// echo "<!-- CACHED -->"
// for debugging hidden from end-user
echo "<em>Above text is served from cache it expires in: " . (mmFragment::getTimeout('samplefragment') - time()) . " seconds</em>";
}
?>

2. Nested fragments

Fragments can be nested. In this example the inner number is cached for 18 seconds and the outer number is cached for 7 seconds. For detalis see the source of snippet.

<?php
if (! mmFragment::load('nestedfragmentouter') ) {
        echo "Outer number: <strong>" . mt_rand(0, 10000) . "</strong><br/>";
                if (! mmFragment::load('nestedfragmentinner')) {
                echo "Inner number:  <strong>" . mt_rand(0, 10000) . "</strong><br/>";
                mmFragment::save(18); //save inner fragment
                }
        mmFragment::save(7); //save outer fragment
}
?>

3. Caching whole page content based on uri

You can cache whole page content as a fragment with key defined as the current URI. For security reasons it's highly recommended to generate md5 (or other) hash of uri. This way you avoid filename collisions / security vulnerabilities.

In your layout put this code at the very beginning:

<?php
$fragmentKey = 'wholePage/' . md5($_SERVER["REQUEST_URI"]);
// or 
// $fragmentKey = md5( $this->url() ); // but this way you don't save query strings like ?id=123&p=12 etc.
if (! mmFragment::load($fragmentKey)) {
?>
// here you put your layout contents

at the end of your layout put this code:

<?php
mmFragment::save(3600); //save cache of current page for 3600 seconds
}
?>

4. Data / variables caching

In this example we store a variable (array) in cache for 13 seconds. If data is present in Cache it will be assigned to $data during the if-condition examining, if it's not cached we'll execute the code inside if-clause, assign $data values and save it to Cache for 13 seconds. Then $data is displayed regardless of being cached or just-generated.

<?php
// Get the instance of mmCache
$cache = mmCache::getInstance();

// if there is no cached data for 'sampledata' make something
// inside the 'if' clause
if (! $data = $cache->get('sampledata') ) {

        // prepare empty array
        $data = array();

        // random array size
        $size = mt_rand(5, 15);

        // fill array with random numbers
        for ($i = 0; $i < $size; $i++) {
                $data[] = 'Random number: ' . mt_rand(1, 1000);
                }

        // store $data for 13 seconds
        $cache->set('sampledata', $data, 13);
}
?>
<pre>
<?php 
print_r($data); 
echo "<em>This data expires in: ". ($cache->getTimeout('sampledata') - time()) . " seconds</em>";
?>
</pre>

License

  • GPLv3 license

Disclaimer

While I make every effort to deliver quality plugins for Wolf CMS, I do not guarantee that they are free from defects. They are provided โ€œas is," and you use it at your own risk. I'll be happy if you notice me of any errors.

I'm not really programmer nor web developer, however I like programming PHP and JavaScript. In fact I'm an architekt.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.