laravellaravel-5cachinglaravel-5.8laravel-cache

Reset Cache TTL in each Access


I was wondering if there is any way to update cache TTL from the last time it has accessed?

currently, I have a method to login to adobe connect with API call and API session is valid for 4 days from the last call. but my cache driver only keeps session in the cache for 4 days from the moment that is added. but I want to keep it for 4 days since the last time it has accessed!

is there any way to update Cache TTL? I'm sure forgetting and reinserting key is not best practice.


    /**
     * Login Client Based on information that introduced in environment/config file
     *
     * @param Client $client
     *
     * @return void
     */
    private function loginClient(Client $client)
    {
        $config = $this->app["config"]->get("adobeConnect");

        $session = Cache::store($config["session-cache"]["driver"])->remember(
            $config['session-cache']['key'],
            $config['session-cache']['expire'],
            function () use ($config, $client) {
                $client->login($config["user-name"], $config["password"]);
                return $client->getSession();
            });

        $client->setSession($session);
    }

Solution

  • You could listen for the event CacheHit, test for the key pattern, and reset the cache for that key with a new TTL.

    To do that, you should create a new listener and add it to the EventServiceProvider:

    protected $listen = [
        'Illuminate\Cache\Events\CacheHit' => [
            'App\Listeners\UpdateAdobeCache',
        ]
    ];
    

    And the listener:

    class UpdateAdobeCache {
    
        public function handle(CacheHit $event)
        {
            if ($event->key === 'the_cache_key') { // you could also test for a match with regexp
                Cache::store($config["session-cache"]["driver"])->put($event->key, $event->value, $newTTL);
            }
        }
    }