PHP APC要缓存还是不缓存?

时间:2011-02-02 06:37:37

标签: php caching apc

我根本没有任何缓存经验,所以这看起来像是一个愚蠢的问题,但是你怎么知道何时缓存你的数据?我甚至找不到一个谈论这个问题的网站,但它可能仅仅是我的搜索技巧或可能需要考虑的太多变量?

我很可能会使用APC。有没有人有任何缓存它需要的数据量最少的例子?例如,假设您有一个包含100个项目的数组,并且您在其上使用foreach循环并执行一些简单的数组操作,是否应该缓存结果?如果它有1000件物品,10000件物品等怎么样?

您应该缓存数据库查询的结果吗?你应该缓存什么样的查询?我假设一个简单的选择,也许一对mysql数据库的连接语句不需要缓存,或者它呢?假设启用了mysql查询缓存,这是否意味着您不需要在应用程序层中缓存,或者您是否还应该这样做?

如果你实例化一个对象,你应该缓存它吗?如何确定是否应该缓存?因此,关于缓存内容的一般指南会很好,示例也非常有用,谢谢。

2 个答案:

答案 0 :(得分:10)

当你在缓存从APC / memcache / WinCache / redis / etc中的数据库中读取的数据时,你应该知道在数据库更新时它不会被更新,除非你明确编码保持数据库和缓存同步。因此,当来自数据库的数据不经常更改时,缓存最有效,但是还需要更复杂和/或更昂贵的查询来从数据库中检索该数据(否则,您也可以在数据库中从数据库中读取它需要它)...如此昂贵的连接查询在运行时返回相同的数据记录是主要候选者。 并始终测试以查看从数据库读取查询是否比从缓存更快。正确的数据库索引可以极大地改善数据库访问时间,特别是因为大多数数据库也维护自己的内部缓存,所以除非数据库开销合理,否则不要使用APC或等效数据来缓存数据。

您还需要了解缓存中的空间使用情况。大多数缓存都是固定大小的,您不希望它们溢出...所以不要使用它们来存储大量数据。使用APC提供的apc.php脚本来监控缓存使用情况(但请确保访问您网站的任何人和所有人都无法公开访问...安全性不佳。)

当在缓存中保存对象时,对象将在存储时被序列化(),并在被检索时被反序列化(),因此存在开销。具有资源属性的对象将丢失该资源;所以不要存储数据库访问对象。

仅使用缓存来存储由许多/所有用户访问的信息而不是用户特定数据是明智的。对于用户会话信息,请坚持使用普通的PHP会话。

答案 1 :(得分:0)

简单的答案是当事情变慢时缓存数据。显然,对于任何中型到大型应用程序,您需要做更多的规划而不仅仅是等待和观察的方法。但对于绝大多数网站而言,问自己的问题是“你对加载时间感到满意吗”。当然,如果你像我一样迷恋加载时间,你会想要试着让它更快,无论如何。

接下来,您必须确定导致缓慢的具体原因。您假设您的应用程序代码是源代码,但是如果存在其他外部因素(如大页面文件大小,请求过多,没有gzip等),则值得检查。使用像http://tools.pingdom.com/这样的网站或像yslow这样的扩展名作为开始吧。 (快速提示确保Keepalive和gzip正常工作)。

假设问题是应用程序代码执行的持续时间,您将需要使用xdebug(http://www.xdebug.org/)来编写代码,并使用kcachegrind或wincachegrind查看输出。这将让您知道代码的哪些部分需要很长时间才能运行。从那里,您将决定缓存内容以及如何缓存它(或改进代码逻辑)。

问题的可能性和相关解决方案有很多可能性,我不值得猜测。因此,一旦确定问题,您可能希望发布与解决该特定问题相关的新问题。我会说如果使用不当,mysql查询缓存可能会适得其反。另外,我通常避免使用APC用户缓存而使用memcached。