我正在尝试将一个应用程序的字符串保存到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”。即使我可以在服务器上看到键/值对。预先感谢您的协助。
答案 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
。