5 Enterprise_PageCache Missing Features

Published: October 27, 2016

A while back I published a post on improving your full page cache hit rate. In a conversation on Twitter, I was asked to provide suggestions on what Magento can do to improve hit rates.

Riding on the coattails of my previous listicle, 5 Enterprise Page Cache Pro Tips, I decided to publish a post in response. However, I’ve broadened the subject from “What can Magento do to improve hit rates?” to “What can Magento do to improve the Enterprise_PageCache module”. Based on my experience working with the module, these are the top 5 missing features that I’ve identified…

1. Query parameter black list

Problem

Digital marketing tool such as ESPs and digital advertising platform add unique identifiers for each URL they generate. Because these identifiers are unique, it is guaranteed that the response will not be able to come from cache.

Further, these platforms introduce many additional query parameters (e.g. utm_*) which are not needed on the server. These will quickly balloon your cache storage space requirements, and make it more likely that a request will surpass the “max depth setting”.

Solution

The solution to this problem is the strip unnecessary query parameters from the URL (e.g. $_GET superglobal) before Enterprise_PageCache generates the cache ID for the response.

We have published a free module at Something Digital which solves this problem.

2. Control over size management strategy

Problem

The cache size management strategy of Enterprise_PageCache is as follows…

  • A “max cache size” setting is available through the admin
  • The size of the current full page cache storage is tracked (in the full page cache) by measuring the size (in bytes) of each response.
  • When Enterprise_PageCache saves the response, it doesn’t set any expiry
  • Once the current cache size exceeds the max cache size, all new saves are rejected and the cache is marked as “invalid” in the admin.

There are a number of problems with this approach…

  • Because no expiry is set, even if a document is only accessed once ever, it will stay in cache forever (until the entire cache is cleared)
  • Because writes are rejected after the current size exceeds the maximum size, if a surge of traffic comes to a URL while the application is in this state, it will all miss the cache

Solution

A feature (which I authored) was added to Cm_Cache_Backend_Redis recently which gives more control over the cache size management strategy. It allows you to…

  • Set an expiry when writing to FPC (even though Enterprise_PageCache doesn’t)
  • Refresh the TTL on access (keeps the cache primed with things that are being accessed most frequently).

This is a step in the right direction, but ideally I would like the ability to control expiry on a route-by-route basis per this gist. I’ll get to why that is important in point 4.

3. Ability to create additional cache entries based on custom cookies

Problem

Magento creates unique cache entries for a given URL based on cookies. This enables functionality such as group pricing and catalog price rules. However, it may be desirable to create additional cache entries based on cookies that are introduced by 3rd party modules or custom code. Recently, I had to rewrite the Enterprise_PageCache request processor to make a feature work which marked down prices on the front end for visitors entering with certain URL query parameters.

Solution

Ideally, the method in Magento which generates the cache key would, in addition to using the out-of-box cookies, allow for some means of configuration for varying cache entries based on custom cookies. There is some additional complexity in the interaction of these cookies with containers.

4. Caching for search results page

Problem

Out of the box Magento caches the typical high throughput routes such as catalog/category/view and catalog/product/view. However, it doesn’t cache catalogsearch/result/index. I’m guessing the thinking behind this was something like…“Search results are highly disparate, so hit rate will be very low. It is not worth caching the search results page.” However, on the flip side of that, it is entirely feasible that a link to a single search results page could be used by a marketing team or shared via a social channel and get a high volume of traffic, which many sites would not be able to withstand without a layer of caching.

Solution

The search results page should be cached, but should have a short TTL. This will prevent the storage requirements from ballooning, but take a lot of pressure off the servers to withstand a burst of traffic to a single search results page.

5. Hit Rate Monitoring

Problem

Cache hit rate is a critical piece of information when monitoring the health of your application. Varnish has built in hit rate monitoring via varnishstat and Cloudflare has an analytics suite built into all accounts. Using Enterprise_PageCache there is no way to understand what percentage of requests are coming from cache.

Solution

I have an entire blog post which outlines a solution (as mentioned, that post is what sparked this list). Ultimately, you’ll be using this free module.

Conclusion

If you have any comments, feel free to drop a note comments below. Of course, as always, you can reach me on Twitter as well.

Max Chadwick Hi, I'm Max!

I'm a software developer who mainly works in PHP, but loves dabbling in other languages like Go and Ruby. Technical topics that interest me are monitoring, security and performance. I'm also a stickler for good documentation and clear technical writing.

During the day I lead a team of developers and solve challenging technical problems at Rightpoint where I mainly work with the Magento platform. I've also spoken at a number of events.

In my spare time I blog about tech, work on open source and participate in bug bounty programs.

If you'd like to get in contact, you can find me on Twitter and LinkedIn.