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_PROTOCOLmemcached 之间切换,它仍然产生相同的空结果。

有趣的是,当我使用 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'));
    }
}