无法检索使用 Laravel 应用程序保存的缓存信息,但试图进入 phalcon 应用程序

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

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

我已确保这两个应用程序都没有为缓存键应用前缀。我在内存缓存服务器上有 运行 'memcached-tool localhost:11211 dump | less' 以确保数据存在,它确实存在。我可以从保存数据的同一个应用程序访问数据。因此,如果我从 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'。即使我可以在服务器上看到 key/value 对。预先感谢您的帮助。

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

例如 Libmemcached 适配器的 get 有:

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

我绕过使用 Phalcons built-in 后端和前端 类,只是在 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;
}
});

我开始沿着 phalcons 使用“_PHCM”的道路走下去,但是一旦上述解决方案奏效,我就放弃了该研究。不是最好的,但适合我的临时情况。