PHP Memcached get总是返回0

6
我有安装memcache(在php5上)和memcached(通过libmemcached在php7.2上安装),两者都连接到同一个memcached守护进程/服务器

Memcache::get可以正常工作,并按照我的期望获取数据。但是当我执行Memcached::get时,它总是返回0。

我已经检查过,使用这两个扩展时我都关闭了压缩。我还尝试在memcached中切换Memcached::OPT_BINARY_PROTOCOL,但仍然产生相同的空结果。

有趣的是,当我使用memcached扩展添加键/值对并使用相同的键进行检索时,我获得了正确的值。

现在我不知道为什么它无法处理已经存储在memcached服务器中的数据。

编辑1:我已经使用telnet连接到我的memcached服务器,并检查了它实际上具有该值。此外,我检查了Memcached::getResultCode返回的结果代码不是任何一种失败。

编辑2:我可能已经进一步缩小了范围。我注意到当我从memcache-php5脚本保存["key1" => "value1"]时,它可以正确地存储和检索数据。但是当我尝试使用memcached-php7.1脚本检索相同的数据时,它返回0。

之后,我使用telnet从memcached服务器中删除了键为“key1”的数据。然后,我使用memcached-php7.1脚本保存["key1" => "value1"],它可以正确地检索该数据。但是在尝试使用memcache-php5脚本检索它时,它返回一种序列化数据"a:1:{s:4:\"key1\";s:6:\"value1\";}"(这是json_encoded输出)

所以为了升级,我可能需要删除/清空所有内容,并使用memcached扩展重新创建memcached服务器中的条目。
附注:我知道这两个php扩展之间的区别。我已经阅读了this question上的所有评论,它不是我的重复问题。

你使用什么操作系统? - Vahe Galstyan
Ubuntu,那有关系吗? - Abubakkar
也许在Windows中会遇到很多问题,但在Linux中应该能够正常工作。 - Vahe Galstyan
那对我来说并不是这样,我可能不得不采纳Diogo在他的回答中提出的建议,这正是我试图避免的。 - Abubakkar
1个回答

5
如您所知,memcachememcached是两个不同的扩展。虽然它们都用于连接到一个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'));
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接