无法检索使用 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”的道路走下去,但是一旦上述解决方案奏效,我就放弃了该研究。不是最好的,但适合我的临时情况。
我正在尝试将带有一个应用程序的字符串保存到 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”的道路走下去,但是一旦上述解决方案奏效,我就放弃了该研究。不是最好的,但适合我的临时情况。