PHP APC是否要缓存?

PHP APC是否要缓存?,php,caching,apc,Php,Caching,Apc,我根本没有任何缓存方面的经验,所以这似乎是一个愚蠢的问题,但您如何知道何时缓存数据?我甚至找不到一个网站来讨论这个问题,但是它可能只是我的搜索技巧,或者是太多的变量需要考虑。 我很可能会使用APC。有没有人举过任何例子来说明缓存数据所需的最少数据量?例如,假设您有一个包含100个项的数组,并且在该数组上使用foreach循环并执行一些简单的数组操作,是否应该缓存结果?如果它有1000件,10000件,等等,怎么样 是否应该缓存数据库查询的结果?您应该缓存什么类型的查询?我假设一个简单的selec

我根本没有任何缓存方面的经验,所以这似乎是一个愚蠢的问题,但您如何知道何时缓存数据?我甚至找不到一个网站来讨论这个问题,但是它可能只是我的搜索技巧,或者是太多的变量需要考虑。 我很可能会使用APC。有没有人举过任何例子来说明缓存数据所需的最少数据量?例如,假设您有一个包含100个项的数组,并且在该数组上使用foreach循环并执行一些简单的数组操作,是否应该缓存结果?如果它有1000件,10000件,等等,怎么样

是否应该缓存数据库查询的结果?您应该缓存什么类型的查询?我假设一个简单的select语句和一对JOIN语句不需要缓存,或者它需要缓存吗?假设mysql查询缓存已打开,这是否意味着您不需要在应用程序层中进行缓存,或者您仍然应该这样做


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

当您在APC/memcache/WinCache/redis/etc中查看从数据库读取的缓存数据时,您应该知道,除非您显式地编写代码以保持数据库和缓存同步,否则在更新数据库时不会对其进行更新。因此,当数据库中的数据不经常更改时,缓存是最有效的,但也需要更复杂和/或更昂贵的查询才能从数据库中检索该数据(否则,您也可以在需要时从数据库中读取该数据)。。。因此,无论何时运行都返回相同数据记录的代价高昂的联接查询都是主要候选查询。 并始终测试从数据库读取查询是否比从缓存读取查询更快。正确的数据库索引可以极大地提高数据库访问时间,特别是当大多数数据库都维护自己的内部缓存时,所以不要使用APC或等效物来缓存数据,除非数据库开销证明了这一点

您还需要了解缓存中的空间使用情况。大多数缓存都是固定大小的,您不想将其填满。。。因此,不要使用它们来存储大量数据。使用apc提供的apc.php脚本来监视缓存使用情况(尽管要确保访问您的站点的任何人和所有人都不能公开访问它……安全性差)

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


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

简单的答案是,当速度变慢时,可以缓存数据。显然,对于任何中大型应用程序,您需要做更多的规划,而不仅仅是观望。但对于绝大多数网站来说,你要问自己的问题是“你对加载时间满意吗?”。当然,如果你像我一样痴迷于加载时间,那么不管怎样,你都会想让加载速度更快

接下来,您必须确定速度缓慢的具体原因。您假设您的应用程序代码是源代码,但是否存在其他外部因素(如页面文件大小过大、请求过多、没有gzip等)值得检查。请使用类似yslow的站点或扩展名作为起点。(快速提示确保keepalives和gzip正常工作)

假设问题是应用程序代码的执行时间,那么您将需要使用类似xdebug的东西来分析代码(http://www.xdebug.org/)并使用kcachegrind或wincachegrind查看输出。这将让您知道代码的哪些部分需要很长时间才能运行。在此基础上,您将决定缓存什么以及如何缓存它(或者改进代码的逻辑)


问题可能是什么以及相关的解决方案有太多的可能性,不值得我去猜测。因此,一旦你确定了问题,你可能想发布一个新的问题来解决这个特定的问题。我要说的是,如果使用不当,mysql查询缓存可能会适得其反。另外,我通常避免使用APC用户缓存,而选择memcached。

@Joker只是一个小插件,如果您还不知道,APC提供了两种类型的缓存,一种是php内部使用的操作码缓存,用于“加快速度”,另一种是用户缓存,您可以使用它来存储数据。用户缓存是这里需要的部分。(如果这是在教人们如何吮吸卵子,我深表歉意——但希望这对遇到这个问题的其他人可能有用)是的,我知道如果启用了apc,操作码缓存会自动工作。当您说您应该进行测试以查看查询是否能够更快地从数据库或缓存中读取时,我将如何进行测试?我什么时候应该只缓存常规数据?例如,我的foreach循环示例。@Joker-测试的方法是实际尝试(使用两种方法)并测量时间。。。虽然在数据库查询中使用EXPLAIN可能会给出一些提示,但没有绝对的数学知识可以提前告诉您。记住,无论如何,您都应该确保数据库上的索引是最好的。对于你的循环示例,也没有任何“硬性”规则。。。这是必须根据具体情况进行评估的事情。我所能说的就是“不要仅仅为了缓存而缓存”,只有在有真正的、可测量的好处时才这样做。我实际上想知道如何准确地测量时间。例如,你只是在前后运行microtime并找出差异吗?@Jok