phplaravelmemcachedphalconlibmemcached

Unable to retrieve a cached piece of information that was saved with Laravel app, but trying to get within a phalcon app


I am trying to save a string with one application to memcached. And then after an http redirect, trying to retrieve that information from a different application on the same server. I am able to save, but retrieving the information is not working.

I have made sure that both applications are not applying a prefix to the cache key. I have run 'memcached-tool localhost:11211 dump | less' on the memcache server to ensure the data exists, which it does. I can access the data from the same application that saves the data. So if I save from the Laravel app, I can retrieve from the laravel app, and vice versa for the phalcon app.

The environment variables used are the same in both apps.

Setup in Laravel (cache.php):

'memcached' => [
            'driver' => 'memcached',
            'servers' => [
                [
                    'host' => env('MEMCACHED_HOST', '127.0.0.1'),
                    'port' => env('MEMCACHED_PORT', 11211),
                    'weight' => 0,
                ],
            ],
        ],

How I am saving in Laravel:

Cache::put($sha, $viewData, 60);
return redirect("someUrl/{$sha}", 302);

Setup in Phalcon:

$di->setShared('memcached', function(){
    // Cache data for one hour
    $frontCache = new \Phalcon\Cache\Frontend\Data(
        [
            'lifetime' => 60,
            'prefix' => ''
        ]
    );

// Create the component that will cache 'Data' to a 'Memcached' backend
// Memcached connection settings
    return new \Phalcon\Cache\Backend\Libmemcached(
        $frontCache,
        [
            'prefix' => '',
            'servers' => [
                [
                    'host'   => MEMCACHED_SERVER,
                    'port'   => MEMCACHED_PORT,
                    'weight' => 0,
                ]
            ]
        ]
    );
});

How I am trying to retrieve info in Phalcon:

$cache = $this->di->getShared('memcached');
$info = $cache->get($cacheKey);

Here is the output of the $cache var from xdebug:

Phalcon\Cache\Backend\Libmemcached::__set_state(array(
   '_frontend' => 
  Phalcon\Cache\Frontend\Data::__set_state(array(
     '_frontendOptions' => 
    array (
      'lifetime' => 60,
      'prefix' => '',
    ),
  )),
   '_options' => 
  array (
    'prefix' => '',
    'servers' => 
    array (
      0 => 
      array (
        'host' => 'servername',
        'port' => port,
        'weight' => 0,
      ),
    ),
    'statsKey' => '',
  ),
   '_prefix' => '',
   '_lastKey' => '38404efbc4fb72ca9cd2963d1e811e95fe76960b',
   '_lastLifetime' => NULL,
   '_fresh' => false,
   '_started' => false,
   '_memcache' => 
  Memcached::__set_state(array(
  )),
))

And here is the dump from memcached-tool:

Dumping memcache contents
add 38404efbc4fb72ca9cd2963d1e811e95fe76960b 4 1562346522 144
a:5:{s:3:"zip";s:0:"";s:10:"first_name";s:5:"Clint";s:9:"last_name";s:9:"Broadhead";s:5:"phone";s:0:"";s:5:"email";s:20:"blah@blah.com";}

I expected to be able to save to memcache from any application and then retrieve that cache from anywhere else that has access to the same server. But when I try to retrieve in the phalcon app I receive 'null'. Even though I can see the key/value pair on the server. Thanks in advance for your assistance.


Solution

  • I bypassed using Phalcons built-in backend and frontend classes and just went with using the PHP ext-memcached on the phalcon app.

    $di->setShared('memcached', function(){
    if( !($this->_memcache instanceof \Memcached) ){
        if( !class_exists('Memcached') ){
            throw new CacheException('Unable to connect to cache');
        }
        $this->_memcache = new \Memcached();
        $this->_memcache->addServer(MEMCACHE_SERVER, MEMCACHE_PORT)
        return $this->_memcache;
    }
    });
    

    I started to go down the path of phalcons use of '_PHCM', but once the above solution worked I abandoned that research. Not the best, but works well for my temporary situation.