PHP Memcached 总是返回 0
PHP Memcached get returning 0 always
我有 memcache
(安装在 php5 上)和 memcached
(通过 libmemcached 安装在 php7.2 上)都连接到同一个 memcached daemon/server
.
Memcache::get
works perfectly fine and fetches the data as per my expectation. But when I do Memcached::get
,总是returns0。
我已经检查过我在使用这两个扩展程序时都关闭了压缩。我还尝试在 Memcached::OPT_BINARY_PROTOCOL
和 memcached
之间切换,它仍然产生相同的空结果。
有趣的是,当我使用 memcached
扩展添加 key/value 对并使用相同的密钥检索时,我得到了我添加的 proper/correct 值。
我现在不知道它对已存储在 memcached 服务器中的数据不起作用的原因是什么。
编辑 1:我对我的 memcached 服务器进行了远程登录,并检查它是否确实具有该值。另外,我检查了 Memcached::getResultCode
返回的结果代码不是任何类型的失败。
编辑 2 :我可能已经进一步缩小了范围。我注意到当我从 memcache-php5
脚本保存 ["key1" => "value1"]
时,它会正确地存储和检索数据。但是当我尝试使用 memcached-php7.1
脚本检索相同的数据时,它 returns 0.
之后,我使用 telnet 从 memcached 服务器中删除了密钥为 "key1" 的数据。然后我使用 memcached-php7.1
脚本保存了 ["key1" => "value1"]
,它可以正确检索该数据。但是当尝试使用 memcache-php5
脚本检索它时,它是 returns 种序列化数据 "a:1:{s:4:\"key1\";s:6:\"value1\";}"
(这是 json_encoded 输出)
所以为了升级,我可能必须 delete/flush 所有内容并使用 memcached 扩展在 memcached 服务器中重新创建条目。
P.S。 : 我知道这两个 php 扩展之间的区别。我已经阅读了 this question 上的所有评论,这不是我的评论。
如您所知,memcache and memcached 是两个不同的扩展名。尽管它们用于相同的目的 - 连接到 memcache 服务器 - 它们中的每一个都以不同的方式序列化数据。
这意味着如果服务器或独立服务器实例中没有适当的缓存刷新,您就无法在它们之间安全地切换。
<?php
$memcache = new Memcache;
$memcacheD = new Memcached;
$memcache->addServer($host);
$memcacheD->addServers($servers);
$checks = array(
123,
4542.32,
'a string',
true,
array(123, 'string'),
(object)array('key1' => 'value1'),
);
foreach ($checks as $i => $value) {
print "Checking WRITE with Memcache\n";
$key = 'cachetest' . $i;
$memcache->set($key, $value);
usleep(100);
$val = $memcache->get($key);
$valD = $memcacheD->get($key);
if ($val !== $valD) {
print "Not compatible!";
var_dump(compact('val', 'valD'));
}
print "Checking WRITE with MemcacheD\n";
$key = 'cachetest' . $i;
$memcacheD->set($key, $value);
usleep(100);
$val = $memcache->get($key);
$valD = $memcacheD->get($key);
if ($val !== $valD) {
print "Not compatible!";
var_dump(compact('val', 'valD'));
}
}
我有 memcache
(安装在 php5 上)和 memcached
(通过 libmemcached 安装在 php7.2 上)都连接到同一个 memcached daemon/server
.
Memcache::get
works perfectly fine and fetches the data as per my expectation. But when I do Memcached::get
,总是returns0。
我已经检查过我在使用这两个扩展程序时都关闭了压缩。我还尝试在 Memcached::OPT_BINARY_PROTOCOL
和 memcached
之间切换,它仍然产生相同的空结果。
有趣的是,当我使用 memcached
扩展添加 key/value 对并使用相同的密钥检索时,我得到了我添加的 proper/correct 值。
我现在不知道它对已存储在 memcached 服务器中的数据不起作用的原因是什么。
编辑 1:我对我的 memcached 服务器进行了远程登录,并检查它是否确实具有该值。另外,我检查了 Memcached::getResultCode
返回的结果代码不是任何类型的失败。
编辑 2 :我可能已经进一步缩小了范围。我注意到当我从 memcache-php5
脚本保存 ["key1" => "value1"]
时,它会正确地存储和检索数据。但是当我尝试使用 memcached-php7.1
脚本检索相同的数据时,它 returns 0.
之后,我使用 telnet 从 memcached 服务器中删除了密钥为 "key1" 的数据。然后我使用 memcached-php7.1
脚本保存了 ["key1" => "value1"]
,它可以正确检索该数据。但是当尝试使用 memcache-php5
脚本检索它时,它是 returns 种序列化数据 "a:1:{s:4:\"key1\";s:6:\"value1\";}"
(这是 json_encoded 输出)
所以为了升级,我可能必须 delete/flush 所有内容并使用 memcached 扩展在 memcached 服务器中重新创建条目。
P.S。 : 我知道这两个 php 扩展之间的区别。我已经阅读了 this question 上的所有评论,这不是我的评论。
如您所知,memcache and memcached 是两个不同的扩展名。尽管它们用于相同的目的 - 连接到 memcache 服务器 - 它们中的每一个都以不同的方式序列化数据。
这意味着如果服务器或独立服务器实例中没有适当的缓存刷新,您就无法在它们之间安全地切换。
<?php
$memcache = new Memcache;
$memcacheD = new Memcached;
$memcache->addServer($host);
$memcacheD->addServers($servers);
$checks = array(
123,
4542.32,
'a string',
true,
array(123, 'string'),
(object)array('key1' => 'value1'),
);
foreach ($checks as $i => $value) {
print "Checking WRITE with Memcache\n";
$key = 'cachetest' . $i;
$memcache->set($key, $value);
usleep(100);
$val = $memcache->get($key);
$valD = $memcacheD->get($key);
if ($val !== $valD) {
print "Not compatible!";
var_dump(compact('val', 'valD'));
}
print "Checking WRITE with MemcacheD\n";
$key = 'cachetest' . $i;
$memcacheD->set($key, $value);
usleep(100);
$val = $memcache->get($key);
$valD = $memcacheD->get($key);
if ($val !== $valD) {
print "Not compatible!";
var_dump(compact('val', 'valD'));
}
}