题 memcache vs memcached?


我想使用memcached

http://www.danga.com/memcached/

我安装了它 yum install memcached

但是现在我需要连接到PHP,并且有一个名为memcache的扩展名和一个名为memcached的扩展名?哎呀

http://us3.php.net/manual/en/book.memcache.php
http://us3.php.net/manual/en/book.memcached.php

有人能指出我正确的方向吗?哪一个会起作用?

此外,我是否需要打开任何端口才能使其工作,即使它是本地的? 运行后,我尝试telnet 127.0.0.1 11211,我得到连接被拒绝。


71
2017-09-08 15:27




如果你现在正在看这个问题,请记住接受的答案是 错误。仅根据名称选择解决方案是危险的,特别是当名称较好的项目更糟糕时。请查看其他答案以获取更多信息。 - tylerl
@thanksyo请取消选中您选中的答案。这只会让更多来这里的人感到困惑。与此同时,我倾向于错误的答案,并建议其他人做同样的事情,直到thanksyo到处取消选中它。 - joedevon
也 stackoverflow.com/q/1442411/632951 - Pacerier


答案:


简短的回答:任何一个都是你要找的,但我的第一选择是memcache(你列出的第一个), 纯粹 基于其正确使用命名法。

现在我来看看这个结论:

这是命名约定的快速背景(对于那些不熟悉的人),这解释了提问者的挫败感:对于许多* nix应用程序,执行后端工作的部分称为“守护程序”(在Windows中认为“服务”) land),而接口或客户端应用程序是您用来控制或访问守护进程的。守护程序通常与客户端命名相同,并附加字母“d”。例如,“imap”将是连接到“imapd”守护程序的客户端。

这个命名惯例显然得到了遵守 内存缓存 当你读到的时候 memcache模块的介绍 (注意本摘录中memcache和memcached之间的区别):

Memcache模块提供了方便   程序性和面向对象   memcached的接口,非常高   有效的缓存守护进程,这是   特别设计减少   动态Web中的数据库负载   应用。

Memcache模块还提供了一个   会话处理程序(memcache)。

有关memcached的更多信息可以   在»找到    http://www.danga.com/memcached/

这里的挫败感是由PHP扩展的作者引起的 memcached的,因为它与名为的实际守护进程共享同一个名称 memcached的。另请注意 memcached介绍(php模块),它提到了 libmemcached,这是模块用于访问memcached守护程序的共享库(或API):

memcached是一个高性能,   分布式内存对象缓存   系统,通用性质,但   旨在用于加速   动态Web应用程序   减轻数据库负载。

此扩展使用libmemcached   库提供API   与memcached服务器通信。   它还提供了一个会话处理程序   (memcached的)。

有关libmemcached的信息可以是   发现在»    http://tangent.org/552/libmemcached.html

总而言之,两者在功能上是相同的,但它们只是具有不同的作者,并且一个被简单地命名为比另一个更合适。


24
2017-09-08 16:16



项目的名称是否真的是选择一个实现而不是另一个实现的合适理由? - David Pashley
大卫:不完全......但是在我的测试中将特定实现留到最后,这当然是足够的理由,从而有效地优先考虑其他人。我很可能仍会尝试所有可用的实现,但作者对软件描述的技术缺陷往往让我想知道软件可能存在哪些技术缺陷。不过,我确实看过你对实际软件的评论,所以我也给了你一个赞成你的答案。 :-) - Jessica McKinnon
我从未想过memcached中的“d”意味着deamon,而是指动词缓存的过去分词。另外,您无法将新界面命名为“memcache”,因为已经有一个具有该名称的界面。 - GetFree
错误的数量以及扩展是否积极开发是 这么多 重要的是肛门有问题的d。说真的,你甚至不应该考虑最后测试一个扩展,因为类似的东西,它完全不受欢迎 - Fake51
呃,两个 不 功能相同: memcached 例如,支持cas令牌 memcache 没有。如果你需要那些,你知道选择哪个(命名与否)。 - Wrikken


你可能想看到 PHP客户端比较

简短版本:它们都可以工作,而且在大多数情况下,任何一个都可以。

关于另一个问题:是的,你应该可以做到 telnet 127.0.0.1 11211。很少有防火墙会阻止localhost与自身通信。如果您无法连接,请通过执行操作验证memcached是否正在运行 ps auxwww | grep memcached,它还将显示用于启动memcached的命令行参数。其中一个论点应该是 -p 11211 或其他端口号。看到 man memcached 为了所有可能的论点的含义。


55
2017-09-08 16:08



Upvote用于添加一些故障排除步骤。 - Jessica McKinnon
这真的是一个明确的答案。 - danidacar
@Nate,Windows等同于什么 ps auxwww | grep memcached? - Pacerier
@Pacerier:看一看 superuser.com/questions/415360/...。 Process Explorer是查找正在运行的进程并查看其命令行参数的最简单方法。 - Nate
@Pacerier命令检查服务器进程是否正在运行并查看它是如何被调用的。 - Jasen


正如Nate的链接所暗示的那样,两者都可以很好地用于简单的使用。但是,memcached支持更多功能,使您可以从memcached中获得最佳性能。二进制协议减少了在客户端和服务器之间发送所需的数据量。多项和多项允许您同时获取/设置多个项目。如果你发现需要更多的内存来自memcache,memcached是更好的模块。 libmemcached的使用表明库本身可能比仅PHP版本更优化。

与memcache相比,Memcached是一个更新的模块,仅在8个月前发布。如果您需要定位旧版本的PHP,那么您只能真正使用内存缓存。


27
2017-09-08 17:56



很棒的解释! - john


较老的,更吵闹的叫 php-memcache 因为那似乎是最合适的名字。由Digg的人独立开发的更新,更好的版本被命名 php-memcached 为了消除歧义。

建议你根据名称的正确性选择一个而不是另一个的人真的没有提供技术建议的业务。


21
2017-08-24 04:15





关于这个问题,这是正确的答案: http://about.digg.com/blog/new-pecl-extension-libmemcached-released


7
2017-08-24 01:17





最近使用过php-memcache,我必须指向php-memcached。

这是我头脑中的几个原因..

1)没有getErrorCode()或等效的方法,所以如果get()返回FALSE,你将不知道是否因为存储在memcache中的值为false,或者是否存在某种问题。

2)用于一致性散列的散列算法似乎与其他实现不同,例如由libmemcached构建的许多客户端库。这意味着如果您想使用具有多种语言的相同内存缓存集群,则可能会遇到使用PHP客户端存储值的问题,而其他客户端则无法找到它。


6
2017-11-09 21:08





两者都有截至今天的问题。 PECL / memcache是​​旧的和可靠的,有一些例外,它已过时。 PECL / memcached 1.x充其量只是测试版。某些函数不处理数字键,在使用持久连接时会泄漏连接。一些(全部?)正在GitHub中修复,并将在2.x中的某个时刻发布,但今天不会发布。有关更详细的评论,请参阅 http://brian.moonspot.net/php-memcached-issues


3
2018-06-24 17:26



PECL / memcached 1.x现在稳定; PECL / memcache 2.x是有限的; PECL / memcache 3.x非常不稳定。 - aredridel


我正在写一本书“Expert PHP and MySQL”。关于差异,我写了几乎相同的东西。我推荐的是PECL / memcached。 #1 - 它包含了一个功能齐全的性能良好的C库#2 - 它最近被维护了。 #3 - 更多功能。不要贬低PECL / memcache。


2
2017-12-02 15:21