ukyo

AvbFastCache Module

Recommended Posts

AvbFastCache Module

Module AuthorBig Thanks to phpFastCache authorsUsage Almost Like original phpfastcache library :

I made some modification on original phpfastcache library for use it with ProcessWire. On my side i tested files and sqlite its look working well.

You can set default settings from module setting panel or you can use it like original library with custom settings for each call, from module setting panel you can set storage type, cache path, security key, fallback and also you can delete cached data from module settings panel.

Modified set function, working like core $cache->get function this function will check a cached data exist ? if not save cache data and return cached data back.

Here is some example usages :

// Load Module
$AvbFastCache = $modules->AvbFastCache;
// Set cache settings from module
$_c = phpFastCache($AvbFastCache->storage, $AvbFastCache->getConfig(), $AvbFastCache->expire);

$output = $_c->set("cacheKeyword", function($page)) {
    $output = '<h1>{$page->title}</h1>';
    $output .= "<div class='body'>{$page->body}</div>";
    
    return $output;
});

//=> OR

// Do MemCache
$_c2 = phpFastCache("memcached");

// Write to Cache Save API Calls and Return Cache Data
echo $_c2->set("identity_keyword", function()) {
    $results = cURL->get("http://www.youtube.com/api/json/url/keyword/page");

    $output = "";
    foreach($results as $video) {
        $output .= $vieo->title; // Output Your Contents HERE
    }

    return $output;
}, 3600*24);

// This will check id=1 or parent_id=1 and will return last modified page UNIX_TIMESTAMP as result
echo $AvbFastCache->getLastModified(1);

// This will check id=1 or parent_id=1 and template=basic-page and will return last modified page UNIX_TIMESTAMP as result
echo $AvbFastCache->getLastModified(1, 'basic-page');

// What can you do with last modified dates ? Let me show you an example

// Think you are in news page, $page->id is news page id we are using $user->language->id because if we have multi language website
// Here getLastModified() function will get last modified date for us, if news page or children pages have any update new cache data will be created automatically
// Like this you can set expire time 0 unlimited from module panel !
// Think we are in "new-list" template and listing children pages
$keyword = "newsPage" . $page->id . $user->language->id . $AvbFastCache->getLastModified($page->id, 'news-single');

// Load library with your settings
$_c3 = phpFastCache($AvbFastCache->storage, $AvbFastCache->getConfig(), $AvbFastCache->expire);

// Write to Cache and Display Result
echo $_c3->set($keyword, function($page)) {

    $output = "";

    foreach($page->children as $p) $output .= "<h2>{$p->title}</h2>";

    return $output;
});

You can check phpfastcache usage from phpfastcache wiki or phpfastcache offical website

Note : I didn't tested this module with older ProcessWire versions, tested with 2.6.1 or newer versions. Module not have core dependency, it could work also older versions but need to check for be sure !

  • Like 7

Share this post


Link to post
Share on other sites

With ProcessWire 2.6.7 or newer version, You can do something like :
 
ready.php, simple example, you can extent this may i missed something and you can have better idea for best caching methods..

// You can set your site templates for cache or ignore cache
$allowedCacheTemplate = array(
        'home',
        'basic-page',
        'contact' => array(
            'ignore' => true
        ),
        'reference',
        'reference-list' => array(
            'list' => true,
            'childTemplate' => 'reference',
            'pagination' => true
        ),
        'service-list' => array(
            'pagination' => true
        )
    );

    wire()->addHook("Page::render", function(HookEvent $event) use($page, $user, $input, $allowedCacheTemplate) {
        $template = $event->template;

        // Check allowed cache templates, if template has ignore or don't have template return $event->return;
        if(isset($allowedCacheTemplate[$template]['ignore']) || !isset($allowedCacheTemplate[$template])) return $event->return;

        // Start Caching
        $avbfastcache = wire('modules')->get('AvbFastCache');
        $_c = phpFastCache($avbfastcache->storage, $avbfastcache->getConfig(), $avbfastcache->expire);
        // Set default keyword
        $keyword = $template . $page->id . $page->modified . $user->language->id;
        // For list view, get children last modified unix time and add it to $keyword
        if(isset($allowedCacheTemplate[$template]['list'])) {
            $filterTemplte = (isset($allowedCacheTemplate[$template]['childTemplate'])) ? $allowedCacheTemplate[$template]['childTemplate'] : NULL;
            $getLastModified = $avbfastcache->getLastModified($page->id, $filterTemplte);
            $keyword .= $getLastModified;
        }
        // If there is a pagination on this template also add $input->pageNum to template
        if(isset($allowedCacheTemplate[$template]['pagination'])) {
            $keyword .= $input->pageNum;
        }
        // Out keyword is ready to use, check cache exist?
        $html = $_c->get($keyword);
        // If cache not exist create cache
        if($html == null) {
            $html = $event->return;;
            $_c->set($keyword, $html);
        }
        // return the result
        return $html;
    });

With this method you can cache template before render !

  • Like 1

Share this post


Link to post
Share on other sites

@ukyo, thanks for this! Looks very cool, and I'll be psyched to test this at some point soon...

Share this post


Link to post
Share on other sites

I updated Hook for ProcessPageSort::execute function and added some useful options. Now you have options for sorted pages.

post-2064-0-39739400-1436662959_thumb.pn

Share this post


Link to post
Share on other sites

what is the advantage over using the built-in cache or procache?

Share this post


Link to post
Share on other sites

what is the advantage over using the built-in cache or procache?

ProCache is a paid version cache module ! Do not compare this free module with paid modules but if you know how to extend module you can do it like ProCache or better than it !

Build-in cache module is only support database cache, on the templates side its support files cache but you can't use it for custom uses. I used both of them there is no place for expire time set option, cached data info or clear cache section etc..

If you check  phpfastcache offical website you will see advantages of using this module. For example you can use multiple cache drivers in same time with different options or you can set a default options for use any where. You can set expire date, you can clear cached data (for files, sqllite drivers), and you can set the what need to do after a page modified etc.....

Here is my website : http://altivebir.com/ using this cache module.

post-2064-0-66734800-1437383025_thumb.pn

  • Like 1

Share this post


Link to post
Share on other sites

Hi @ukyo

I want to use your AVBfastcache module in my new project but can't find any information about its capability with PW 3.

Also, there is no activity in repo and forum more than a year, so I'm curious about your plans to maintain this module.

Share this post


Link to post
Share on other sites
19 hours ago, Zeka said:

Hi @ukyo

I want to use your AVBfastcache module in my new project but can't find any information about its capability with PW 3.

Also, there is no activity in repo and forum more than a year, so I'm curious about your plans to maintain this module.

I will update module with latest phpFastCache (v6). I think this update will come next month.

  • Like 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By BitPoet
      So I stumbled over the request to allow limiting templates to be used only once under every parent page in this thread
      and found that this would actually come in handy (also in a site I've built).
      The code can be found on github and soon in the module repo.
      After installation, you'll find a new checkbox "Only once per parent" in the family tab when editing a template.

    • By Robin S
      Password Generator
      Adds a password generator to InputfieldPassword.

       
      Usage
      Install the Password Generator module.
      Now any InputfieldPassword has a password generation feature. The settings for the generator are taken automatically from the settings* of the password field.
      *Settings not supported by the generator:
      Complexify: but generated passwords should still satisfy complexify settings in the recommended range. Banned words: but the generated passwords are random strings so actual words are unlikely to occur.  
      https://modules.processwire.com/modules/password-generator/
      https://github.com/Toutouwai/PasswordGenerator
    • By Robin S
      If you've ever needed to insert links to a large number of files within CKEditor you may have found that the standard PW link modal is a somewhat slow way to do it.
      This module provides a quicker way to insert links to files on the page being edited. You can insert a link to an individual file, or insert an unordered list of links to all files on the page with a single click.
      CKEditor Link Files
      Adds a menu to CKEditor to allow the quick insertion of links to files on the page being edited.

      Features
      Hover a menu item to see the "Description" of the corresponding file (if present). Click a menu item to insert a link to the corresponding file at the current cursor position. The filename is used as the link text. If you Alt-click a menu item the file description is used as the link text (with fallback to filename if no description entered). If text is currently selected in the editor then the selected text is used as the link text. Click "* Insert links to all files *" to insert an unordered list of links to all files on the page. Also works with the Alt-click option. Menu is built via AJAX so newly uploaded files are included in the menu without the page needing to be saved. However, descriptions are not available for newly uploaded files until the page is saved. Installation
      Install the CKEditor Link Files module.
      For any CKEditor field where you want the "Insert link to file" dropdown menu to appear in the CKEditor toolbar, visit the field settings and add "LinkFilesMenu" to the "CKEditor Toolbar" settings field.
       
      http://modules.processwire.com/modules/cke-link-files/
      https://github.com/Toutouwai/CkeLinkFiles
    • By matjazp
      A module for managing files and folders. Supports creating, opening (e.g. viewing, playing, editing), renaming, moving, copying, deleting and searching for files. You can also view and change (not supported on Windows) file and directory permissions. 
      https://github.com/matjazpotocnik/ProcessFileManager

      The author of FileManager component is (c) 2006 - 2018 Gerd Tentler, http://www.gerd-tentler.de/tools/filemanager/. I modified it to work with ProcessWire as a module. Please see license files on usage in commercial projects!
    • By Robin S
      An inputfield for displaying markup editable via CKEditor.
      The module is intended for use with the Form Builder module. Allows blocks of static text to be included within a form, which can be edited in the form settings using CKEditor.
      Usage
      Install the Markup CKEditor module.
      In the Form Builder module settings, add "MarkupCKEditor" to "Inputfield types to use with FormBuilder".
      In your form settings, add a new field of type "Markup CKEditor". Enter the text you want to show in this field using "Markup Text" on the "Details" tab.
      Screenshots


       
      http://modules.processwire.com/modules/inputfield-markup-ckeditor/
      https://github.com/Toutouwai/InputfieldMarkupCKEditor