无法检索使用Laravel应用保存的缓存信息,但尝试进入Phalcon应用

时间:2019-07-03 21:39:02

标签: php laravel memcached phalcon libmemcached

我正在尝试将一个应用程序的字符串保存到memcached。然后在http重定向之后,尝试从同一服务器上的其他应用程序检索该信息。我可以保存,但无法检索信息。

我确保两个应用程序均未将前缀应用于缓存键。我已经运行'memcached-tool localhost:11211 dump |记忆快取伺服器上的[较少],以确保资料确实存在。我可以从保存数据的同一应用程序访问数据。因此,如果我从Laravel应用程序中保存,则可以从laravel应用程序中检索,反之亦然,对于Phalcon应用程序而言。

两个应用程序中使用的环境变量相同。

在Laravel(cache.php)中设置:

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

我如何在Laravel中保存:

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

在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,
                ]
            ]
        ]
    );
});

我如何尝试在Phalcon中检索信息

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

这是xdebug中$ cache变量的输出:

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(
  )),
))

这是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";}

我希望能够从任何应用程序保存到内存缓存,然后从有权访问同一服务器的其他任何地方检索该缓存。但是,当我尝试在Phalcon应用程序中检索时,会收到“ null”。即使我可以在服务器上看到键/值对。预先感谢您的协助。

2 个答案:

答案 0 :(得分:1)

我绕过使用了Phalcons内置的后端和前端类,而只是在phalcon应用程序上使用了PHP ext-memcached。

$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;
}
});

我开始沿用'_PHCM'的方式使用phalcons,但是一旦上述解决方案起作用,我便放弃了该研究。不是最好的,但是对于我的临时情况很好。

答案 1 :(得分:0)

Phalcon默认情况下对所有缓存键使用前缀。对于Libmemcached适配器

例如get适配器的Libmemcached具有:

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

只需在选项中设置prefix选项,确保没有前缀

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

    // 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,
                ]
            ]
        ]
    );
});

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

最后,如果上述方法不起作用,请安装实用程序,该实用程序将允许您查询Memcached实例并查看其中存储了哪些密钥。在使用Laravel存储数据之前,请先进行检查,然后再进行检查。这样,您将知道是否检查正确的事情。

或者,如果您熟悉命令行检查密钥,则可以使用较旧的telnet