SlideShare a Scribd company logo
Or how to make visitor specific
content super fast.
Caching the
uncachable
I'm Daniel Rotter
@danrot90 | https://github.com/danrot
core developer and
support guru.
Passionate traveler and
soccer player.
Who knows about
HTTP Caching?
HTTP Caching Basics
A short recap
Browser
Reverse
Proxy
Symfony
Application
GET / GET /
200 OK 200 OK
Browser
GET /
200 OK
GET /
HTTP/1.1 200 OK
Cache-Control: public, max-age=3600, s-maxage=86400
<!DOCTYPE html>
<html>
<body>
Interesting content
</body>
</html>
GET /
HTTP/1.1 200 OK
Last-Modified: Sun, 4, Feb 2018 20:18:00 GMT
<!DOCTYPE html>
<html>
<body>
Quite recent Content
</body>
</html>
GET /
If-Modified-Since: Sun, 4 Feb 2018 20:18:00 GMT
HTTP/1.1 304 Not Modified
Apply more logic in the reverse proxy layer
Custom HTTP Header
200 OK
Cache-Control: max-age=240
Browser
Reverse
Proxy
Symfony
Application
GET / GET /
200 OK
Cache-Control: max-age=240
200 OK
X-Reverse-Proxy-TTL: 2400
Browser
GET /
200 OK
Cache-Control: max-age=240
200 OK
X-Reverse-Proxy-TTL: 2400
200 OK
Cache-Control: max-age=240
Browser
Reverse
Proxy
Symfony
Application
GET / GET /
Browser
GET /
PURGE /
GET /
200 OK
X-Reverse-Proxy-TTL: 2400
Caching
Implementations
Symfony Cache or Varnish?
Symfony Cache
– Easy to setup
– Implemented in PHP
– Not feature complete
// src/CacheKernel.php
<?php
namespace App;
use SymfonyBundleFrameworkBundleHttpCacheHttpCache;
class CacheKernel extends HttpCache {}
// public/index.php
<?php
use AppKernel;
use AppCacheKernel;
// ...
$kernel = new Kernel($env, $debug);
$kernel = new CacheKernel($kernel);
// ...
// src/Controller/NameController.php
<?php
namespace AppController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAnnotationRoute;
class NameController {
/**
* @Route("/name/{name}")
*/
public function index(string $name) {
$response = new Response('Your name is ' . $name);
$response->setSharedMaxAge(3600);
return $response;
}
}
– Harder to setup
– Implemented in C
– Super performant
– Many more features
– Configured using VCL
Varnish
Varnish Installation
1. Actually install varnish
2. Start varnish on port 80
3. Start your application on a different port
4. Tell varnish on which port your application is running
5. Add varnish as a trusted proxy in Symfony
6. Add cache headers to your responses
7. Configure the cache with VCL in more detail
# default.vcl
vcl 4.0;
# Default backend definition. Set this to point to your content server.
backend default {
.host = "127.0.0.1";
.port = "8080";
}
4
// public/index.php
// ...
Request::setTrustedProxies(['127.0.0.1'], Request::HEADER_X_FORWARDED_ALL);
// ...
5
// src/Controller/NameController.php
<?php
namespace AppController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAnnotationRoute;
class NameController {
/**
* @Route("/name/{name}")
*/
public function index(string $name) {
$response = new Response('Your name is ' . $name);
$response->setSharedMaxAge(3600);
return $response;
}
} 6
# default.vcl
sub vcl_recv {
# Happens before we check if we have this in cache already.
#
# Typically you clean up the request here, removing cookies you don't need,
# rewriting the request, etc.
}
sub vcl_deliver {
# Happens when we have all the pieces we need, and are about to send the
# response to the client.
#
# You can do accounting or modifying the final object here.
}
7
Caching the Uncacheable
Audience Targeting
Show (and cache!) different content for different target
groups on the same URL
Audience Targeting
Goals
– Differentiate between different visitor target groups
– Target groups are evaluated by a ruleset
– first visit
– each browser session
– each hit
– Do not start a session on the server
– Cache the response per target group
Caching the Uncacheable
Caching the Uncacheable
Caching the Uncacheable
Who knows the Vary
header?
Browser
Reverse
Proxy
Symfony
Application
GET /en
Accept-Encoding: gzip
200 OK
Vary: Accept-Encoding
GET /en
Accept-Encoding: identity
200 OK
Cache-Control: max-age=0
GET /en
Accept-Encoding: gzip
200 OK
Vary: Accept-Encoding
GET /en
Accept-Encoding: gzip
200 OK
Vary: Accept-Encoding
Browser
200 OK
Vary: Accept-Encoding
GET /en
Accept-Encoding: identity
Browser
Reverse
Proxy
Symfony
Application
GET /en
GET /_sulu_target_group
X-Sulu-Original-Url: /en
GET /en
X-Sulu-Target-Group: 1
200 OK
X-Sulu-Target-Group: 1
200 OK
Vary: X-Sulu-Target-Group
X-Reverse-Proxy-TTL: 2400
200 OK
Cache-Control: max-age=0
Set-Cookie: _svtg=1;
Set-Cookie: _svs=...;
GET /en
Cookie: _svtg=1; _svs=..
200 OK
Cache-Control: max-age=0
Reverse
Proxy
Symfony
Application
GET /about-us
Cookie: _svtg=1; _svs=..
GET /about-us
X-Sulu-Target-Group: 1
200 OK
X-Reverse-Proxy-TTL: 2400200 OK
Browser
Browser
GET /about-us
Cookie: _svtg=1; _svs=..
200 OK
Symfony Cache
Use extended version of the SymfonyCache from Sulu to support
Audience Targeting
<?php
namespace SuluComponentHttpCache;
use SymfonyBundleFrameworkBundleHttpCacheHttpCache as AbstractHttpCache;
use SymfonyComponentHttpKernelHttpKernelInterface;
class HttpCache extends AbstractHttpCache
{
public function __construct(HttpKernelInterface $kernel, $hasAudienceTargeting =
false, $cacheDir = null)
{
parent::__construct($kernel, $cacheDir);
$this->hasAudienceTargeting = $hasAudienceTargeting;
}
}
// app/WebsiteCache.php
<?php
use SuluComponentHttpCacheHttpCache;
class WebsiteCache extends HttpCache
{
}
// web/website.php
<?php
// ...
$kernel = new WebsiteKernel(SYMFONY_ENV, SYMFONY_DEBUG);
$kernel->loadClassCache();
if (SYMFONY_ENV != 'dev') {
$kernel = new WebsiteCache($kernel, true);
Request::enableHttpMethodParameterOverride();
}
// ...
Varnish
VCL to the rescue!
“I really love VCL!
Said no one,
ever.
Caching the Uncacheable
vcl 4.0;
import header;
backend default {
.host = "127.0.0.1";
.port = "8000";
}
sub vcl_recv {
if (req.http.Cookie ~ "_svtg" && req.http.Cookie ~ "_svs") {
set req.http.X-Sulu-Target-Group = regsub(req.http.Cookie, ".*_svtg=([^;]+).*", "1");
} elseif (req.restarts == 0) {
set req.http.X-Sulu-Original-Url = req.url;
set req.http.X-Sulu-Target-Group = regsub(req.http.Cookie, ".*_svtg=([^;]+).*", "1");
set req.url = "/_sulu_target_group";
} elseif (req.restarts > 0) {
set req.url = req.http.X-Sulu-Original-Url;
unset req.http.X-Sulu-Original-Url;
}
unset req.http.Cookie;
}
sub vcl_deliver {
if (resp.http.X-Sulu-Target-Group) {
set req.http.X-Sulu-Target-Group = resp.http.X-Sulu-Target-Group;
set req.http.Set-Cookie = "_svtg=" + resp.http.X-Sulu-Target-Group + "; expires=Tue, 19 Jan 2038
03:14:07 GMT; path=/;";
return (restart);
}
if (resp.http.Vary ~ "X-Sulu-Target-Group") {
set resp.http.Cache-Control = regsub(resp.http.Cache-Control, "max-age=(d+)", "max-age=0");
set resp.http.Cache-Control = regsub(resp.http.Cache-Control, "s-maxage=(d+)", "s-maxage=0");
}
if (req.http.Set-Cookie) {
set resp.http.Set-Cookie = req.http.Set-Cookie;
header.append(resp.http.Set-Cookie, "_svs=" + now + "; path=/;");
}
}
zz
Sulu
Docs
Good ol’ Javascript
How to reevaluate
target groups on
cache hit?
Thanks for watching!
sulu.io

More Related Content

PDF
Drupal camp South Florida 2011 - Introduction to the Aegir hosting platform
PDF
Ansible : what's ansible & use case by REX
PDF
Using aphace-as-proxy-server
PDF
Set up Hadoop Cluster on Amazon EC2
PPTX
Linux for programmers
PDF
Caching on the Edge
PDF
PPT
Hadoop on ec2
Drupal camp South Florida 2011 - Introduction to the Aegir hosting platform
Ansible : what's ansible & use case by REX
Using aphace-as-proxy-server
Set up Hadoop Cluster on Amazon EC2
Linux for programmers
Caching on the Edge
Hadoop on ec2

What's hot (20)

PDF
Apache and PHP: Why httpd.conf is your new BFF!
PPTX
Ansible Network Automation session1
PDF
DEF CON 27- ALBINOWAX - http desync attacks
PPT
Apache Presentation
PPTX
Http caching basics
KEY
Site Performance - From Pinto to Ferrari
PDF
php & performance
PDF
HTTP Caching in Web Application
PPT
Apache Web Server Setup 4
PPT
Apache installation and configurations
PDF
WordPress Home Server with Raspberry Pi
PPTX
Php psr standard 2014 01-22
PDF
PHP & Performance
PPTX
Advanced HTTP Caching
PPT
Apache Web Server Setup 1
PDF
VUG5: Varnish at Opera Software
PDF
How we use and deploy Varnish at Opera
PDF
ReplacingSquidWithATS
PPTX
Northeast PHP - High Performance PHP
Apache and PHP: Why httpd.conf is your new BFF!
Ansible Network Automation session1
DEF CON 27- ALBINOWAX - http desync attacks
Apache Presentation
Http caching basics
Site Performance - From Pinto to Ferrari
php & performance
HTTP Caching in Web Application
Apache Web Server Setup 4
Apache installation and configurations
WordPress Home Server with Raspberry Pi
Php psr standard 2014 01-22
PHP & Performance
Advanced HTTP Caching
Apache Web Server Setup 1
VUG5: Varnish at Opera Software
How we use and deploy Varnish at Opera
ReplacingSquidWithATS
Northeast PHP - High Performance PHP
Ad

Similar to Caching the Uncacheable (20)

PDF
Leverage HTTP to deliver cacheable websites - Codemotion Rome 2018
PDF
Leverage HTTP to deliver cacheable websites - Thijs Feryn - Codemotion Rome 2018
PDF
Developing cacheable PHP applications - PHPLimburgBE 2018
PDF
Developing cacheable PHP applications - Confoo 2018
PDF
Fargate 를 이용한 ECS with VPC 1부
PPT
Varnish and Drupal- Accelerating Website Performance and Flexibility with Var...
ODP
Caching and tuning fun for high scalability
PDF
Grâce aux tags Varnish, j'ai switché ma prod sur Raspberry Pi
PPT
Lecture 11 - PHP - Part 5 - CookiesSessions.ppt
PPT
Lecture 11 - PHP - Part 5 - CookiesSessions.ppt
PDF
ApacheConNA 2015: What's new in Apache httpd 2.4
PPTX
Microsoft Windows Server AppFabric
PDF
WordPress At Scale. WordCamp Dhaka 2019
PPTX
June8 presentation
PPTX
Learn nginx in 90mins
PPTX
AEM (CQ) Dispatcher Security and CDN+Browser Caching
PDF
Tips
PDF
[Devconf.cz][2017] Understanding OpenShift Security Context Constraints
KEY
HTML5와 모바일
PDF
Nginx + PHP
Leverage HTTP to deliver cacheable websites - Codemotion Rome 2018
Leverage HTTP to deliver cacheable websites - Thijs Feryn - Codemotion Rome 2018
Developing cacheable PHP applications - PHPLimburgBE 2018
Developing cacheable PHP applications - Confoo 2018
Fargate 를 이용한 ECS with VPC 1부
Varnish and Drupal- Accelerating Website Performance and Flexibility with Var...
Caching and tuning fun for high scalability
Grâce aux tags Varnish, j'ai switché ma prod sur Raspberry Pi
Lecture 11 - PHP - Part 5 - CookiesSessions.ppt
Lecture 11 - PHP - Part 5 - CookiesSessions.ppt
ApacheConNA 2015: What's new in Apache httpd 2.4
Microsoft Windows Server AppFabric
WordPress At Scale. WordCamp Dhaka 2019
June8 presentation
Learn nginx in 90mins
AEM (CQ) Dispatcher Security and CDN+Browser Caching
Tips
[Devconf.cz][2017] Understanding OpenShift Security Context Constraints
HTML5와 모바일
Nginx + PHP
Ad

Recently uploaded (20)

PDF
iTop VPN Free 5.6.0.5262 Crack latest version 2025
PDF
Cost to Outsource Software Development in 2025
PPTX
Embracing Complexity in Serverless! GOTO Serverless Bengaluru
PDF
Navsoft: AI-Powered Business Solutions & Custom Software Development
PPTX
L1 - Introduction to python Backend.pptx
PDF
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 41
PDF
How to Make Money in the Metaverse_ Top Strategies for Beginners.pdf
PDF
Complete Guide to Website Development in Malaysia for SMEs
PDF
medical staffing services at VALiNTRY
PDF
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
PPTX
AMADEUS TRAVEL AGENT SOFTWARE | AMADEUS TICKETING SYSTEM
PPTX
Reimagine Home Health with the Power of Agentic AI​
PPTX
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
PDF
Digital Systems & Binary Numbers (comprehensive )
PDF
Autodesk AutoCAD Crack Free Download 2025
PDF
Product Update: Alluxio AI 3.7 Now with Sub-Millisecond Latency
PDF
iTop VPN 6.5.0 Crack + License Key 2025 (Premium Version)
PDF
Tally Prime Crack Download New Version 5.1 [2025] (License Key Free
PDF
CCleaner Pro 6.38.11537 Crack Final Latest Version 2025
iTop VPN Free 5.6.0.5262 Crack latest version 2025
Cost to Outsource Software Development in 2025
Embracing Complexity in Serverless! GOTO Serverless Bengaluru
Navsoft: AI-Powered Business Solutions & Custom Software Development
L1 - Introduction to python Backend.pptx
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
Internet Downloader Manager (IDM) Crack 6.42 Build 41
How to Make Money in the Metaverse_ Top Strategies for Beginners.pdf
Complete Guide to Website Development in Malaysia for SMEs
medical staffing services at VALiNTRY
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
AMADEUS TRAVEL AGENT SOFTWARE | AMADEUS TICKETING SYSTEM
Reimagine Home Health with the Power of Agentic AI​
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
Digital Systems & Binary Numbers (comprehensive )
Autodesk AutoCAD Crack Free Download 2025
Product Update: Alluxio AI 3.7 Now with Sub-Millisecond Latency
iTop VPN 6.5.0 Crack + License Key 2025 (Premium Version)
Tally Prime Crack Download New Version 5.1 [2025] (License Key Free
CCleaner Pro 6.38.11537 Crack Final Latest Version 2025

Caching the Uncacheable