This Textpattern plugin provides an events-driven cache solution for Textpattern CMS.
Textpattern is fast, but when you have thousands of articles, processing the whole list (say, for creating a sitemap) can become time consuming. It’s a good idea (unless you publish an article every minute) to cache the processed result. Naturally, the cached block must be updated when content/an article is added/deleted. Most caching plugins trigger this update when the corresponding page is visited after the site update – this has, however, two inconveniences:
That’s what etc_cache is aimed to solve.
Using Composer:
$ composer require etc-plugins/etc_cache:*
Or download the latest version of the plugin from the GitHub project page, paste the code into the Textpattern Plugins administration panel, install and enable the plugin. Visit the forum thread for more info or to report on the success or otherwise of the plugin.
The basic usage is:
<txp:etc_cache id="heavycode">
...heavy...
</txp:etc_cache>
id="id name"
<br />A unique identifier name for this cached item.reset="value"
<br />See reset information below.time="value"
<br />See time information below.The code will be processed and cached until the site is updated. On site update, the plugin (if configured so) will ping the URL containing this block, triggering the cache refresh. Hence, the cache will always stay up to date, without penalizing site visitors.
To configure automatic cache updates, visit Extensions region Cache administration panel and edit reset field of each block. The possible values are:
1
: (default) update client-side if expired or the site was updatedarticle_posted, article_saved
or SQL LIKE
pattern like article%
: update server-side when a matching event is fired.The value %
thus means ‘auto-update on each site update’, but will act as 1
client-side too.
You can be more specific with cache reset criteria. Say, if you need a block to be reset only if the article 3 is updated, set:
reset: article_saved
filter: {"article_saved":{"ID":3}}
You can also pass a reset
attribute directly to etc_cache:
<txp:etc_cache id="archive" reset="article%">
...heavy code building an articles archive...
</txp:etc_cache>
If needed, one can pass a time
attribute to etc_cache:
<txp:etc_cache id="dailycode" time="+1 day">
...daily code...
</txp:etc_cache>
A positive (relative) value of time will indicate that the cache (even a fresh one) must be reset on site update.
An absolute value like time='<txp:modified format="%F %T" gmt="1" /> +1 month'
will mean ‘cache it if not modified since one month’.
A negative value will not observe site updates, for example (-900
seconds is equiavlent to 15 minutes):
<txp:etc_cache id=“api-feed” time=”-900”>
…feed code…
</txp:etc_cache>
If enabled (in Advanced options prefs pane), the plugin will store visited pages as flat files. If you want these pages to be served from disk on ulterior visits, add the following after the first RewriteRule
group of your site's .htaccess
(modify path/to/site
as appropriate):
RewriteCond %{REQUEST_METHOD} =GET
RewriteCond %{QUERY_STRING} ^$
RewriteCond %{DOCUMENT_ROOT}/path/to/site/cache/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/path/to/site/cache/$1index.html -f
RewriteRule ^(.*) cache/$1 [PT,L]
RewriteCond %{REQUEST_METHOD} =GET
RewriteCond %{QUERY_STRING} ^$
RewriteCond %{DOCUMENT_ROOT}/path/to/site/cache/$1.html -f
RewriteRule ^(.*) cache/$1.html [PT,L]
You can prevent some pages from being cached via Advanced prefs.
Written by Oleg Loukianov. Many thanks to all additional contributors.