6

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

Memcache::get工作得很好,并按照我的期望获取数据。但是当我这样做时Memcached::get,它总是返回 0。

我检查了使用这两个扩展时是否已关闭压缩。Memcached::OPT_BINARY_PROTOCOL我也尝试在for之间切换memcached,它仍然产生相同的 null 结果。

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

我现在一无所知,这可能是它不适用于已存储在 memcached 服务器中的数据的原因。

编辑 1:我对我的 memcached 服务器进行了 telnet,并检查了它是否确实具有价值。另外,我检查了返回的结果代码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 服务器中重新创建条目。

PS:我知道这两个 php 扩展之间的区别。我已经阅读了关于这个问题的所有评论,这不是我的重复。

4

1 回答 1

5

如您所知,memcachememcached是两个不同的扩展。即使它们用于相同的目的——连接到内存缓存服务器——它们中的每一个都以不同的方式序列化数据。

这意味着您无法在它们之间安全地切换,除非在服务器或独立服务器实例中没有适当的缓存刷新。

<?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'));
    }
}
于 2018-02-27T11:30:22.060 回答