geocoder-php/cache-provider
Cache provider for Geocoder PHP: integrates PSR-6/PSR-16 caches to store geocoding results and reduce API calls. Helps improve performance and avoid rate limits by reusing responses across requests.
Installation
composer require geocoder-php/cache-provider
Requires geocoder-php/geocoder (≥v3.0) and a supported cache driver (e.g., predis/predis, symfony/cache).
Basic Usage
Register the cache provider in your Geocoder configuration (e.g., config/geocoder.php):
'cache' => [
'provider' => \Geocoder\CacheProvider\CacheProvider::class,
'driver' => 'predis', // or 'symfony_cache', 'array', etc.
'options' => [
'prefix' => 'geocoder_',
'ttl' => 3600, // 1 hour
],
],
First Use Case Enable caching for a provider (e.g., Google Maps):
use Geocoder\Geocoder;
use Geocoder\Provider\GoogleMapsProvider;
$geocoder = new Geocoder();
$geocoder->registerProvider(new GoogleMapsProvider([
'key' => 'YOUR_API_KEY',
'cache' => true, // Enable caching
]));
// Subsequent identical queries will use cached results
$results = $geocoder->geocode('1600 Amphitheatre Parkway, Mountain View');
Hybrid Caching Strategy
Combine with Geocoder\Cache\Adapter\MultipleAdapter for multi-layer caching (e.g., Redis + filesystem):
$cache = new \Geocoder\Cache\Adapter\MultipleAdapter([
new \Geocoder\CacheProvider\CacheProvider($redisClient),
new \Geocoder\Cache\Adapter\FilesystemAdapter('/path/to/cache'),
]);
Dynamic TTL per Query Override TTL for specific queries:
$geocoder->geocode('Paris', [
'cache_ttl' => 86400, // 24 hours
]);
Cache Invalidation Clear cache for a provider or globally:
$geocoder->getProvider('google_maps')->getCache()->clear();
// OR
$geocoder->getCache()->clear();
'cache' => [
'driver' => env('CACHE_DRIVER', 'redis'),
'options' => [
'prefix' => env('CACHE_PREFIX', 'geocoder_'),
],
],
$geocoder->geocode('Address 1', ['cache' => false]);
$geocoder->geocode('Address 2', ['cache' => false]);
Geocoder\Provider\FallbackProvider to cache fallback results:
$geocoder->registerProvider(new \Geocoder\Provider\FallbackProvider([
'providers' => [new GoogleMapsProvider(), new OpenStreetMapProvider()],
'cache' => true,
]));
Cache Key Collisions
"Paris" vs. "Paris, France") may generate identical cache keys if not properly normalized.getCacheKey() method handles query normalization (e.g., trimming whitespace, case-insensitive matching).TTL Misconfiguration
ttl too high may serve stale data (e.g., for frequently changing addresses like event venues).Cache Driver Dependencies
predis) require additional PHP extensions (e.g., php-redis).ClassNotFoundException and install missing extensions:
pecl install redis
Memory Leaks
CacheProvider::prune()) or use a size-limited adapter like symfony/cache-adapter-apcu.$geocoder->getProvider('google_maps')->setLogger(function ($message) {
\Log::debug($message);
});
$cache = $geocoder->getProvider('google_maps')->getCache();
$keys = $cache->getAdapter()->getKeys(); // If supported by adapter
Custom Cache Keys Override the cache key generation:
$provider = new GoogleMapsProvider([
'cache' => true,
'cache_key_generator' => function ($query) {
return md5(strtolower(trim($query)));
},
]);
Preload Cache Warm the cache for critical locations during deployment:
$geocoder->geocode('New York, NY'); // Preload
$geocoder->geocode('San Francisco, CA'); // Preload
Event-Based Invalidation
Listen to model events (e.g., AddressUpdated) to invalidate cache:
use Geocoder\CacheProvider\CacheProvider;
Address::updated(function ($address) {
$cache = app(CacheProvider::class);
$cache->delete("address_{$address->id}");
});
Cache Provider Chaining
Combine with Geocoder\Cache\Adapter\ChainAdapter for layered caching:
$adapter = new \Geocoder\Cache\Adapter\ChainAdapter([
new \Geocoder\CacheProvider\CacheProvider($redis),
new \Geocoder\Cache\Adapter\FilesystemAdapter('/tmp/geocoder'),
]);
How can I help you explore Laravel packages today?