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