schickling / laravel-cash
Simple to use cache layer for your laravel application using memcached & nginx.
Requires
Requires (Dev)
- laravel/framework: 4.1.*
- mockery/mockery: dev-master
- orchestra/testbench: 2.1.*
- satooshi/php-coveralls: 0.6.*
This package is not auto-updated.
Last update: 2024-11-05 03:10:45 UTC
README
Simple to use cache layer for your laravel application using memcached & nginx. ~400% faster response times.
How it works
The packages caches the responses to GET
requests in memcached using the URL as key. Any further requests get served the cached content by nginx directly without running PHP. Writing actions can easily invalidate the cache.
Features
- Easy to setup and use
- Self defined invalidation rules
- Automatic cache refilling
- Cache warmup
Dependencies
- Laravel 4.1
- nginx (installation guide)
- memcached && PHP memcached extension (installation guide)
Quick setup
-
Add the following to your composer.json and run
composer update
{ "require": { "schickling/laravel-cash": "dev-master" } }
-
Add
Schickling\Cash\CashServiceProvider
to your config/app.php -
Ajust your nginx vhost (more configurations)
upstream memcached { server 127.0.0.1:11211; keepalive 1024; } upstream laravel { server 127.0.0.1:9999; } server { listen *:80; server_name myapp.dev; root /path/to/your/public; index index.php; rewrite ^/(.*)$ /index.php?/$1 last; location ~ \.php$ { default_type "application/json"; if ($request_method = GET) { set $memcached_key laravel:$request_uri; memcached_pass laravel; error_page 404 502 = @nocache; } if ($request_method != GET) { fastcgi_pass laravel; } } location @nocache { fastcgi_pass laravel; } }
Usage
Add cache filter to routes
Add the 'after' => 'cash'
filter to GET
routes you want to be cached. Works also for groups of routes.
Route::get('users', array('after' => 'cash', function() { return User::all(); }));
Define invalidation rules
Add rules of the following syntax in your routes.php
file. The $routeToInvalidate
parameter may be a string or an array and describe always GET
routes.
Cash::rule($httpMethod, $triggerRoute, $routesToInvalidate);
Let's say you have a cached GET users
route to retrieve all users and a POST users
route to create a new user. Your goal is to invalidate the GET users
cache if a new user was created.
Cash::rule('POST', 'users', 'users');
Multiple route caches
Cash::rule('POST', 'users', array('users', 'premium/users'));
Dynamic rules
Dynamic trigger routes
Cash::rule('POST', 'users/.*/photos', 'photos');
Dynamic invalidation routes
Cash::rule('POST', 'photos', 'photos/*');
Flush cache
Simply restart memcached.
Coming soon (please contribute a pull request)
- Support for named routes
- Support for rules in route group scope
- More precise hierarchic invalidation
- Apache support
- Memcache support
- Cache warmup
- Individual cache rewarmup