As of Laravel 5.3, memcached is supported out of the box with the php-memcached
PECL extension. Instructions on how to install php-memcached
can be found here. Older versions of Laravel require laravel-memcached-plus
for memcached integration.
Before setting up memcached
as your default cache we need to add the dependency to composer.json
:
$ composer require ext-memcached
Then we need to config the cache in config/cache.php
:
'memcached' => [
'driver' => 'memcached',
'persistent_id' => 'memcached_pool_id',
'sasl' => [
('MEMCACHIER_USERNAME'),
env('MEMCACHIER_PASSWORD'),
env],
'options' => [
// some nicer default options
// - nicer TCP options
Memcached::OPT_TCP_NODELAY => TRUE,
Memcached::OPT_NO_BLOCK => FALSE,
// - timeouts
Memcached::OPT_CONNECT_TIMEOUT => 2000, // ms
Memcached::OPT_POLL_TIMEOUT => 2000, // ms
Memcached::OPT_RECV_TIMEOUT => 750 * 1000, // us
Memcached::OPT_SEND_TIMEOUT => 750 * 1000, // us
// - better failover
Memcached::OPT_DISTRIBUTION => Memcached::DISTRIBUTION_CONSISTENT,
Memcached::OPT_LIBKETAMA_COMPATIBLE => TRUE,
Memcached::OPT_RETRY_TIMEOUT => 2,
Memcached::OPT_SERVER_FAILURE_LIMIT => 1,
Memcached::OPT_AUTO_EJECT_HOSTS => TRUE,
],
'servers' => array_map(function($s) {
$parts = explode(":", $s);
return [
'host' => $parts[0],
'port' => $parts[1],
'weight' => 100,
];
, explode(",", env('MEMCACHIER_SERVERS', 'localhost:11211')))
}],
The values for MEMCACHIER_SERVERS
, MEMCACHIER_USERNAME
, and MEMCACHIER_PASSWORD
are listed on your cache overview page. Make sure to add them to your environment.
For Laravel to use memcached as its cache you will need to set the CACHE_DRIVER
environment variable in the .env
file:
CACHE_DRIVER=memcached
Note, if you prefer you may also configure memcached
to be your default cache driver in config/cache.php
:
'default' => env('CACHE_DRIVER', 'memcached'),
For more information on how to use the cache in Laravel, we recommend you consult the Laravel caching documentation or our Laravel tutorial.
Memcached works well for sessions that time out, however, since memcached is a cache and thus not persistent, saving long-lived sessions in memcached might not be ideal. For long-lived sessions consider a permanent storage option such as you database.
Changing the session store from a file (default) to memcached can be done easily by just setting an environment variable in the .env
file:
SESSION_DRIVER=memcached
With the help of laravel-partialcache you can also cache rendered partials in Laravel. This is essentially the same as fragment caching in Ruby on Rails. If you have complex partials in your application it is a good idea to cache them because rendering HTML can be a CPU intensive task.
warning Do not cache partials that include forms with CSRF tokens.
You can add this dependency to your Laravel project with
$ composer require spatie/laravel-partialcache
and it will give you the @cache
blade directive. It works just like the @include
directive with a few added parameters.
For example,
@cache('my-complex.partial', ['data' => $data], null, $data->id)
will include my-complex.partial
, pass it $data
with the identifier data
and cache it forever (null
) and add $data->id
to the cache key.
You can invalidate this cached partial with from your code with PartialCache::forget('my-complex.partial', $data->id);
.
In Laravel it is also easy to cache the entire rendered HTML response by using laravel-responsecache. This is essentially the same as view caching in Ruby on Rails. This package is easy to use and has good documentation in it’s README. To use this package with memcached you have to set the environment variable RESPONSE_CACHE_DRIVER
to memcached
.