Escalando sua aplicação para milhões de visitas: Estratégias de Caching
Vídeo da Apresentação (2016/06/07): https://youtu.be/z8qkUITz5rU
Source-code de exemplo: https://gist.github.com/Zizaco/1777fe7566f334dc04d83b17f7832007
O que é Cache?
Guardar algo temporáriamente para uso posterior.
Por que usar Cache?
Encurtar o tempo de acesso, reduzir a latência e melhorar o input/output.
Caching é usado para melhorar a performance de uma aplicação.
Laravel Request Lifecycle
- HTTP
- WebServer
- HTTP Kernel
- Middlewares
- index.php
- autoload
- Routes
- Controller
- External Services
- File System
- Databases
- Models / Services
- View
autoload:
APC & Zend OpCache (OpCode Cache)
Até 3x mais rápido
Routes:
Laravel's Route Caching
"Using the route cache will drastically decrease the amount of time it takes to register all of your application's routes. In some cases, your route registration may even be up to 100x faster"
php artisan route:cache
Até 3x mais rápido
Middleware (action caching):
public function handle($request, Closure $next)
{
$path = $request->path();
if ($this->cacheManager->isCached($path) && $this->canBeCached($request)) {
return $this->cacheManager->get($path);
}
return $next($request);
}
...
public function terminate($request, $response)
{
$path = $request->path();
if ($this->cacheManager->isCached($path) || !$this->canBeCached($request)) {
return;
}
$this->cleanCookies($response);
$this->cacheManager->cache($path, $response);
}
View:
@include
@cached_include
function cached_include($view, $vars = null, $time = 60)
{
$cacheKey = $view . md5(serialize($vars));
return Cache::remember(
$cacheKey,
$time,
function () use ($view) {
return view(
$view,
is_array($vars) ? $vars : array_except(get_defined_vars(), ['__data', '__path'])
)->render();
}
);
}
Blade::extend(
function ($view) {
$pattern = '/@cached_include\((.*)\)/';
return preg_replace($pattern, "", $view);
}
);
Model / Services:
General Caching
Reverse Proxy:
Reverse Proxy (ou CDN)
"A reverse proxy can reduce load on its origin servers by caching content [...] also known as web acceleration. Proxy caches of this sort can often satisfy a considerable number of website requests, greatly reducing the load on the origin server(s)."
Varnish Cache
Akamai
Nginx
Standard HTTP Caching:
Lições Aprendidas para tirar o máximo do Caching:
- Feature flipping ("switch" central para desativar cache)
- Criar serviços "CacheManager" para cachear e invalidar quando necessário.
- Comece o quanto antes
- Compactar antes de cachear pode ser uma boa ideia.
- Cache local VS Cache compartilhado
- CDN
Fontes:
Speed up PHP with APC - Jacob Nicholson
http://www.inmotionhosting.com/support/website/what-is/speed-up-php-with-apc
PHP Performance I: Everything You Need To Know About OpCode Caches - Davey Shafik
https://support.cloud.engineyard.com/hc/en-us/articles/205411888-PHP-Performance-I-Everything-You-Need-to-Know-About-OpCode-Caches
Laravel Documentation: Route Caching
https://laravel.com/docs/master/controllers#route-caching
Caching Routes Using Filters - Mark van Eijk
http://markvaneijk.com/caching-routes-using-filters-in-laravel-4
Google Developers: HTTP Caching
https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching
Varnish Cache
https://varnish-cache.org/
Nginx: Reverse Proxy with Caching
https://www.nginx.com/resources/wiki/start/topics/examples/reverseproxycachingexample/