我在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);
内存缓存服务器位于AWS上,并且运行良好(生产服务器)。 此测试代码有效-从内存缓存服务器获取值。 但是,如果我等了几分钟再刷新,它将不会返回值。 然后,如果我再次刷新,它将返回该值。
同一代码/配置可在另一台开发计算机上工作。
是什么原因造成的?
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
答案 0 :(得分:4)
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才能使更改生效。
您可以参考:https://pureform.wordpress.com/2008/01/10/installing-memcache-on-windows-for-php/
由于您在Windows上使用PHP 7,因此可能还很重要的一点是要注意,PECL编译的DLL可能实际上无法在Windows的apache下运行,因为您很有可能使用了theaded SAPI。因此,请确保您下载的是正确的版本。据我所知,该版本只能编译为与PHP 5.6一起使用。如注释中所述,可在https://github.com/nono303/PHP7-memcahe-dll获得适用于PHP 7的github替代方案,并在非线程安全下进行了测试。因此,您可能只能在Windows上的CLI脚本中使用此功能。
答案 1 :(得分:0)
问题似乎更多地在于您编写(set
)和获取(get
)具有多个节点的数据的方式。 -Memcache不支持复制。
尝试一个节点,在这种情况下,设置完后您应该可以获取数据。
当具有多个节点“ sharding”是存储数据的常用方法时,这意味着已实施了一个逻辑,以确定用于写入或获取数据的服务器:
来自https://en.wikipedia.org/wiki/Memcached:
客户端使用客户端库与服务器联系,服务器默认情况下在端口11211公开其服务。TCP和UDP均受支持。每个客户端都知道所有服务器;服务器之间无法相互通信。如果客户端希望设置或读取与某个密钥相对应的值,则客户端的库首先计算密钥的哈希值,以确定要使用的服务器。这提供了跨服务器分片和可扩展的无内容架构的简单形式。
因此,在PHP客户端中,您可以尝试使用一致的哈希:
$memcache = new Memcache;
$memcache->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
发件人:http://www.php.net/manual/en/memcached.constants.php
Memcached::OPT_LIBKETAMA_COMPATIBLE
Enables or disables compatibility with libketama-like behavior. When enabled,
the item key hashing algorithm is set to MD5 and distribution is set
to be weighted consistent hashing distribution. This is useful because
other libketama-based clients (Python, Ruby, etc.) with the same server
configuration will be able to access the keys transparently.
Note:
It is highly recommended to enable this option if you want to use
consistent hashing, and it may be enabled by default in future releases.
另外,尝试:
memcache.hash_strategy = consistent;
查看此帖子以获取更多详细信息:https://blog.fedecarg.com/2008/12/24/memcached-consistent-hashing-mechanism/
答案 2 :(得分:-1)
检查您的
memcache.redundancy
memcache.redundancy
设置,则并非在每个内存缓存节点上都可以使用您的数据。在您的示例情况下,将其设置为3就足够了。