skip to Main Content

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 PhalconCacheFrontendData(
        [
            'lifetime' => 60,
            'prefix' => ''
        ]
    );

// Create the component that will cache 'Data' to a 'Memcached' backend
// Memcached connection settings
    return new PhalconCacheBackendLibmemcached(
        $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:

PhalconCacheBackendLibmemcached::__set_state(array(
   '_frontend' => 
  PhalconCacheFrontendData::__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:"[email protected]";}

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.

2

Answers


  1. Chosen as BEST ANSWER

    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.


  2. Phalcon uses prefixes for all cache keys by default. For the Libmemcached adapter

    For instance the get for the Libmemcached adapter has:

    let prefixedKey = this->_prefix . keyName;
    let this->_lastKey = prefixedKey;
    let cachedContent = memcache->get(prefixedKey);
    

    https://github.com/phalcon/cphalcon/blob/3.4.x/phalcon/cache/backend/libmemcached.zep#L160

    Just make sure that there are no prefixes by setting the prefix option in your options

    $di->setShared('memcached', function(){
        // Cache data for one hour
        $frontCache = new PhalconCacheFrontendData(
            [
                'lifetime' => 60,
            ]
        );
    
        // Create the component that will cache 'Data' to a 'Memcached' backend
        // Memcached connection settings
        return new PhalconCacheBackendLibmemcached(
            $frontCache,
            [
                'prefix'  => '',
                'servers' => [
                    [
                        'host'   => MEMCACHED_SERVER,
                        'port'   => MEMCACHED_PORT,
                        'weight' => 0,
                    ]
                ]
            ]
        );
    });
    

    https://github.com/phalcon/cphalcon/blob/3.4.x/phalcon/cache/backend.zep#L59

    Finally if the above does not work, install a utility that will allow you to query your Memcached instance and see what keys are stored there. Check it before you store data with Laravel and then afterwards. This way you will know whether you check the correct thing or not.

    Alternatively you can use good old telnet if you are comfortable with the command line to check the keys.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search