windows 10上的Memcache PHP扩展间歇性工作

windows 10上的Memcache PHP扩展间歇性工作,php,apache,xampp,php-extension,libmemcache,Php,Apache,Xampp,Php Extension,Libmemcache,我在apache/php windows 10上有memcache扩展(详细信息见末尾) 创建了一个简单的测试: $memcache = new Memcache; $memcache->addServer("ext-memcached.e-memcached.xxx.net",11211); $memcache->addServer("ext-memcached.e-memcached2.xxx.net",11211); $memcache->addServer("ext-m

我在apache/php windows 10上有memcache扩展(详细信息见末尾)

创建了一个简单的测试:

$memcache = new Memcache;
$memcache->addServer("ext-memcached.e-memcached.xxx.net",11211);
$memcache->addServer("ext-memcached.e-memcached2.xxx.net",11211);
$memcache->addServer("ext-memcached.e-memcached3.xxx.net",11211);

$key='xxx_54921';
$settings = $memcache->get($key);
print_r ($settings);
memcache服务器位于AWS上,运行良好(生产服务器)。 此测试代码有效-它从memcache服务器检索值。 但是,如果我等待几分钟并刷新它,它将不会返回值。 然后,如果我再次刷新,它将返回值

相同的代码/配置在另一台开发人员计算机上工作

这是什么原因造成的

Config:
PHP Version 5.6.34
    Windows NT SPECTRE 6.2 build 9200 (Windows 8 Home Premium Edition) i586
Build Date  Feb 28 2018 17:45:55
Compiler    MSVC11 (Visual C++ 2012)
Architecture    x86

Memcache extension:
ts x86 version from here:
https://windows.php.net/downloads/pecl/releases/memcache/3.0.8/

memcache info:
memcache support    enabled
Version 3.0.8
Revision    $Revision: 329835 $
Directive   Local Value Master Value
memcache.allow_failover 1   1
memcache.chunk_size 32768   32768
memcache.compress_threshold 20000   20000
memcache.default_port   11211   11211
memcache.hash_function  crc32   crc32
memcache.hash_strategy  standard    standard
memcache.lock_timeout   600 600
memcache.max_failover_attempts  20  20
memcache.protocol   ascii   ascii
memcache.redundancy 1   1
memcache.session_redundancy 2   2
检查你的
memcache.redundancy

设置时,您的数据在每个memcached节点上都不可用。在您的示例中,将其设置为3就足够了。

memcached服务实际上并没有为您安装PHP memcached扩展。它只安装用于存储缓存的memcached服务器

您需要首先从PECL存储库下载Windows DLL(单击蓝色的Windows DLL链接)。然后必须将extension=php_memcache.dll行添加到SAPI的正确php.ini文件中。另外,请注意,扩展DLL文件需要放置在XAMPP安装的正确路径中

对于Apache,只需在文档根目录中创建一个脚本 对于CLI SAPI,您可以使用php.exe--ini执行相同的操作。同样,如果XAMPP包修改了您的配置路径(因为这是一个编译时指令),那么您可能需要依赖它

在对php.ini进行更改后,需要重新启动php才能使更改生效

你可以参考:


由于您在Windows上使用的是PHP7,因此可能还需要注意的是,PECL编译的DLL实际上可能无法在apache for Windows下工作,因为您很可能使用的是一个加密的SAPI。因此,请确保您正在下载正确的版本。据我所知,该版本的编译只适用于高达PHP5.6的版本。注释中提到的用于PHP7的github替代方案在非线程安全环境下进行测试。因此,您可能只能在Windows上对CLI脚本执行此操作。

问题似乎更多地在于您编写(
set
)和获取(
get
)具有多个节点的数据的方式。-Memcache不支持复制

尝试单个节点,在这种情况下,您应该可以在设置后立即获取数据

当具有多个节点“”是存储数据的常用方法时,这意味着实施了一个逻辑,以确定用于写入或获取数据的服务器:

发件人:

客户端使用客户端库联系服务器,默认情况下,服务器在端口11211公开其服务。TCP和UDP都受支持。每个客户端都知道所有服务器;服务器之间不通信。如果客户机希望设置或读取与某个键对应的值,则客户机的库首先计算该键的散列,以确定要使用哪个服务器。这提供了一种简单的分片形式和跨服务器的可扩展无共享体系结构

因此,在PHP客户端中,您可以尝试一致的哈希:

$memcache = new Memcache;
$memcache->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
发件人:

此外,请尝试:

 memcache.hash_strategy = consistent;
查看此帖子了解更多详细信息:


答案是:

与其他dev计算机有什么不同吗?php版本,memcache信息,memcache版本,…?你能试试$stats=$memcache->getExtendedStats()吗;打印(统计数据);在添加服务器之后?另外,在$memcache->get之前,您可以放置一个“sleep(2);”,它可能是当您尝试获取缓存未命中的密钥和结果时,memcache库中服务器的“内部计数”尚未更新。我不想冗余问题说memcache服务器在aws上。
 memcache.hash_strategy = consistent;