PHP Memcached总是返回0

时间:2018-02-20 11:34:39

标签: php memcached libmemcached

我有memcache(安装在php5上)和memcached(通过libmemcached安装在php7.2上)都连接到同一个memcached daemon/server

Memcache::get完全正常,并按照我的期望获取数据。但是当我做Memcached::get时,它总是返回0.

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

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

我现在无能为力,因为它不适用于已存储在memcached服务器中的数据。

编辑1 :我确实telnet到我的memcached服务器,并检查它实际上是否有值。另外,我检查了Memcached::getResultCode返回的结果代码并没有任何失败。

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

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

因此,为了升级,我可能必须删除/刷新所有内容并使用memcached扩展在memcached服务器中重新创建条目。

P.S。 :我知道这两个PHP扩展之间的差异。我已经阅读了this question上的所有评论,这不是我的重复。

1 个答案:

答案 0 :(得分: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'));
    }
}