Skip to content

Cache ​

The CMS has two layers of cache: compressed static assets (compiled CSS and JavaScript) and the API response cache (JSON responses served from APCu memory). Both are controlled from Settings → Cache.

Cache settings with Enable cache toggle, TTL input, and two action buttons

1. The response cache ​

The Response Cache stores JSON responses from GET requests in APCu memory. The next identical request returns from memory in microseconds — no database, no PHP logic, no session touch.

Configuration ​

FieldPurpose
Enable cacheMaster switch. Uncheck to disable the response cache entirely.
Cache-Timeout in secondsThe TTL for cache entries. Typical values: 300 (5 min), 3600 (1 h).

Click Save. The new settings apply on the next request.

What is cached ​

Cache hit conditions (all must be true):

  • Method is GET.
  • No user session is active ($_SESSION['userid'] is empty).
  • No Backend session is active.
  • No X-Api-Key header.
  • TTL > 0.
  • The endpoint is not in the exclude list (see below).

Responses carry an X-Cache header telling you what happened:

  • X-Cache: HIT — served from memory.
  • X-Cache: MISS — computed fresh, stored in memory.
  • No header — not cache-eligible (session present, POST, backend endpoint, or excluded).

What is never cached ​

  • All backend/* endpoints (hardcoded).
  • Authenticated requests (any session).
  • API-key requests (counted per key, not worth the shared cache).
  • POST, PATCH, DELETE.
  • Endpoints listed in the exclude config.

The exclude list lives in _public/extensions/core/backend/cache_settings/config/cache_exclude_endpoints.json. Prefix-matched against the request path. Typical entries: shop/cart, auth, checkout.

2. Clear the cache ​

The Clear cache button clears all APCu cache entries — response cache, rate-limit buckets, cached exclude lookups. Use it after:

  • Bulk content changes (mass import, deploy).
  • Editing runtime translations.
  • Changing the exclude config.
  • Any time the frontend shows stale data.

Click the button. A success banner confirms the cache was cleared.

Cache clear affects rate limits too

APCu holds more than responses — it also holds the rate-limit tokens. Clearing resets every bucket, so a DoS in progress would get a fresh budget. On a live site, prefer targeted invalidation (e.g. restart PHP-FPM only during a maintenance window).

3. Compress CSS and JS ​

The Compress JS and CSS button runs the asset pipeline:

  • Concatenates and minifies every LESS file that compiles to frontend CSS.
  • Bundles JavaScript.
  • Re-generates the custom CSS for Pagebuilder spacing, flex, and custom-CSS fields.
  • Compiles the custom LESS from Design Tokens (see Design Tokens).

Run this after:

  • Changing design tokens in Settings → Design.
  • Deploying a new theme.
  • Editing LESS files directly on the server.

The compressed output lands in _public/cache/ and is served by the frontend with a long browser-cache header.

Browser cache ​

Compressed assets carry a long Cache-Control: max-age=31536000, immutable header. When you compress, a new hash goes into the filename — browsers load the new file automatically. Stale browser caches are not a problem for the CSS/JS layer.

For the content layer (pages, blog, product listings), the response cache + the cache-busting query on internal links handles freshness.

How APCu fits in ​

The response cache, the rate limiter, the exclude-config lookup, and the cache-settings TTL are all stored in APCu (shared memory within a single PHP-FPM pool). If APCu is not installed:

  • Response cache becomes a no-op (still computes responses).
  • Rate limiter falls back to "always allow".
  • Cache-settings TTL is read from DB on every request.

Check the Task Manager → System Status panel. The APCu card must read Active. If it reads Inactive, ask your developer to install php-apcu.

Common issues ​

I edited content but the frontend still shows the old version. Click Clear cache. For a single page, the response cache has a 5-minute TTL by default, so waiting also works.

The frontend shows unstyled content right after a deploy. Click Compress JS and CSS. Deploys copy files but do not always re-run the compressor.

X-Cache: HIT on a page I just edited. Same cause — clear the cache or wait for the TTL.

Rate limiting seems to never trigger. APCu is disabled. Verify on Task Manager → System Status.

See also ​