Memcached和APC,我应该选择哪一个?

165
我读了这篇文章:http://www.mysqlperformanceblog.com/2006/09/27/apc-or-memcached/,想要得到最好的缓存引擎以使我的应用程序变得非常快。当然,我不想过度缓存,但至少要选择最好的东西。 在那篇文章中,它说Memcached很慢,而apc很快,那么为什么每个人都选择memcached呢? 此处提到:“使用一个快速的(但有限的)引擎,例如Apc,Memcache...和一个像文件、Sqlite这样“慢”的引擎...”,您认为将Apc作为快速引擎,将Memcache作为缓慢引擎是个好主意吗?

15
顺便说一下,即使您不使用apc_store,也应该使用APC。仅使用Opcode缓存可以使PHP运行速度提高几倍。 - Kornel
@porneL:你的意思是什么?即使我没有在我的脚本中添加缓存代码,只要安装了APC,它就会增加PHP的速度吗? - Marco Demaio
5
@Marco Demaio:确实。 APC主要是PHP优化器(只要启用,就默认进行优化),而apc_store()只是在此基础上额外的加分项。 - Kornel
3
2014年,如果您只在一个服务器上用于缓存,请选择APCu。 - Flion
另外,https://dev59.com/gXNA5IYBdhLWcg3wgeOk - Pacerier
7个回答

275

Memcached是一种分布式缓存系统,而APC则是非分布式的主要是一个opcode缓存。

只有当你有一个需要存在不同web服务器(负载平衡)上的Web应用程序时,才需要使用memcache进行分布式缓存。如果不需要,请使用APC及其缓存。

您应始终使用opcode缓存,其中APC是(也将集成到php6 iirc中,因此为什么不现在开始使用它呢)。

您可以/应该为不同的目的同时使用两者。


5
惊人的答案 +1。我现在的问题是什么是opcode缓存? - Marco Demaio
4
如果你有不同的服务器(例如云负载均衡环境),只要你不需要在它们之间维护/共享状态,APC作为一个纯内存缓存也可以正常工作——尽管可能不像最优解那样良好,因为每个云实例都必须自己预热其缓存... - Ray
36
Opcode缓存是将纯PHP代码编译成机器码("opcode"),并以编译后的形式保存起来,以备未来请求使用(直到检测到原始PHP文件已更改)。这意味着PHP不必在每个请求上运行此编译步骤,从而节省一些时间。这只是确保网站运行速度快的众多方法之一。 - Simon East
2
这里有一个有趣的幻灯片,用图表和基准测试解释了一些差异:http://www.slideshare.net/FordAntiTrust/php-performance-with-apc-memcached - Simon East
1
Memcached能在非分布式系统中代替APC使用吗?如果将来您会有更多的机器,只保留一个是很好的选择,对吗?或者同时使用它们,一个用于opcode,另一个用于可扩展缓存? - Adib Aroui
这个答案还是最新的吗?根据这篇维基百科文章:https://en.wikipedia.org/wiki/List_of_PHP_accelerators#Alternative_PHP_Cache_.28APC.29,APC似乎*将输出缓存到共享内存中*。或者说共享内存和分布式系统不是同一个概念吗? - Adam

44

如果您需要在多个Web服务器之间保留状态(例如负载均衡),并且缓存的内容在所有服务器上都要相同,请使用Memcached。

如果您只需要在一个(或每个)服务器上快速读取(和写入)内存,请使用APC。

请记住,APC还可以编译和加速脚本执行时间。因此,您可以使用APC来提高执行性能,同时使用Memcached进行缓存存储。


3
APC也可以缓存存储吗?或者呢? - mr_app
7
2014年更新:PHP 5.5将本地包含Zend Optimizer Plus(仅适用于opcache,因此不适用于用户缓存),而APC似乎在PHP 5.4之后将不再开发?但是现在有APCu http://pecl.php.net/package/APCu,它仅采用了APC的用户缓存部分。 - Flion

20

APC的主要优点是字节码缓存。因为PHP 5.5将OpCache集成到其核心中,而针对PHP 5.4的APC仍然被标记为测试版,这不是官方公告,但是在不久的将来,APC的开发将会停止。

因此,我建议您选择Memcached。


5
我在网上花了数小时思考它,得出了相同的结论。 - Nicolas Zozol

9

我同时使用两种方法,一种是为了提高速度,另一种则是为了同步所有服务器。如果您使用memcache,请务必注意需要用iptables阻止开放端口。


6
嗨,Thomaschaaf,希望现在还不晚,但请注意APC存在与“用户缓存”相关的问题。简而言之,当您为缓存条目设置超时时间时,或者如果您的Apache崩溃在内部APC代码中(例如超时),则可能会遇到一些问题。
我在这里有一篇关于此问题的文章:http://nirlevy.blogspot.com/2009/06/apc-futexwait-lockdown-make-your-apache.html,您还应该阅读http://t3.dotgnu.info/blog/php/user-cache-timebomb.html(来自APC开发人员之一的文章)。

22
我看到了这个信息,并想更新一下,现在似乎已经解决了(应该是两年后才解决的)。例如,这里有一个已关闭的错误报告:http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=572529 - Shane H

1

这取决于你正在做什么,但对于我在VPS上运行的Drupal网站,APC效果很好!如果你正在运行CentOS 6,它可以作为yum更新提供,因此安装非常简单,而且默认配置是合理的,无需进行任何配置。在我看来,这是一个不需要考虑的选择。


1

我只使用 APC,因为APC是一个代码缓存,并且像memcache一样工作!而且只需要1个配置文件而不是2个。

并且只需要在一个地方监视这两个缓存......


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接