cache/memcached-adapter
PSR-6 cache pool backed by Memcached. Create a Memcached client, add servers, and use MemcachedCachePool for fast, standards-based caching. Part of the PHP Cache ecosystem with shared docs for tagging and hierarchy support.
composer require cache/memcached-adapter
config/cache.php):
'memcached' => [
'driver' => 'memcached',
'servers' => [
[
'host' => 'localhost',
'port' => 11211,
'weight' => 100,
],
],
'options' => [
'prefix' => 'laravel_', // Avoid key collisions
'compression' => true, // Enable for large payloads
],
],
use Illuminate\Support\Facades\Cache;
// Store with TTL (10 minutes)
Cache::put('user:123', ['name' => 'John'], 600);
// Retrieve
$user = Cache::get('user:123');
// Tag-based invalidation (if using tags)
Cache::tags('users')->remember('user:123', 600, fn() => ['name' => 'John']);
vendor/laravel/framework/src/Illuminate/Cache/CacheManager.php for built-in Memcached support.\Memcached options (e.g., sasl_auth_data, retry_timeout) in the Memcached PHP docs.Tag-Based Caching (Laravel Example):
// Cache user data with tags
Cache::tags(['users', 'premium'])->put('user:123', $userData, now()->addHour());
// Invalidate by tag (e.g., after user update)
Cache::tags('users')->flush();
Hierarchical Caching (Fallback to Redis):
$pool = new \Cache\Adapter\Memcached\MemcachedCachePool(
$memcachedClient,
['fallback' => new \Cache\Adapter\Redis\RedisCachePool($redisClient)]
);
Batch Operations:
// Delete multiple keys at once
Cache::forget(['user:1', 'user:2', 'user:3']);
// Get multiple keys (PSR-6 `getItems`)
$items = Cache::many(['user:1', 'user:2']);
Laravel Cache Manager:
Bind the adapter in config/cache.php:
'connections' => [
'memcached' => [
'driver' => 'memcached',
'servers' => [...],
'options' => [...],
],
],
Then use Cache::store('memcached')->....
Dependency Injection:
public function __construct(private MemcachedCachePool $cache) {}
Register the pool in AppServiceProvider:
$this->app->bind(MemcachedCachePool::class, function ($app) {
$client = new \Memcached();
$client->addServer(...);
return new MemcachedCachePool($client);
});
Event Listeners:
Use Cache::tags('users')->flush() in UserUpdated event listeners to invalidate cached user data.
Key Collisions:
prefix, keys may clash with other services using Memcached.'prefix' => 'laravel_' (or a unique namespace) in config.Connection Failures:
MemcachedException if servers are unreachable.$pool = new MemcachedCachePool($client, [
'fallback' => new NullCachePool(), // Graceful degradation
]);
Large Payloads:
max_item_size).'compression' => true) or serialize data to reduce size.Tagging Limitations:
TTL Granularity:
$ttl = ceil(now()->diffInSeconds($expiryTime));
$client->getStats(); // Inspect Memcached server health
$client->setOption(\Memcached::OPT_LOGGING, true);
$client->setOption(\Memcached::OPT_DEBUG, 32767); // Verbose logging
Cache::store('memcached')->getItemMetadata('key') to debug TTL/flags.Custom Item Class:
Override Cache\Taggable\TaggedCacheItem for custom metadata:
class CustomCacheItem extends TaggedCacheItem {
public function getCustomField() { ... }
}
Pass it to the pool constructor:
new MemcachedCachePool($client, [], CustomCacheItem::class);
Event Subscribers:
Extend Cache\Event\EventEmitter to hook into beforeGet, afterSet, etc.:
$pool->addEventSubscriber(new class implements EventSubscriber {
public function onBeforeGet(Item $item) { ... }
});
Pool Wrappers: Create a decorator for cross-cutting concerns (e.g., logging, metrics):
class LoggingCachePool implements CacheItemPoolInterface {
public function __construct(private CacheItemPoolInterface $pool) {}
public function getItem($key) {
Log::debug("Fetching key: $key");
return $this->pool->getItem($key);
}
// Delegate other methods...
}
'weight' in server config to distribute load (e.g., ['weight' => 50] for half the traffic).$client->setOption(\Memcached::OPT_BINARY_PROTOCOL, true);
$client->setSaslAuthData('username', 'password');
$client->setOption(\Memcached::OPT_PERSISTENT, true);
How can I help you explore Laravel packages today?