如何使用Memcached加速我的PHP应用程序

如何使用Memcached加速我的PHP应用程序,php,optimization,memcached,Php,Optimization,Memcached,我最近在一个网站上工作,想加快我的申请速度。 我想缓存我用户的页面,但是页面是动态的,就像有人发布了一个新的feed,然后主页就会用这个新的feed更新。如果我缓存了一个用户的主页,他的朋友发布了一个新的提要,我希望缓存过期,下次他再次访问主页时,应用程序会联系数据库,获取新提要并缓存它 我在数据库中使用memcache、PHP和MySQL。 我有一个名为friends、feeds和users的表 缓存每个用户的朋友是否有效?当该用户发布提要时,我的应用程序会获取他/她的朋友并使用他们的用户ID

我最近在一个网站上工作,想加快我的申请速度。 我想缓存我用户的页面,但是页面是动态的,就像有人发布了一个新的feed,然后主页就会用这个新的feed更新。如果我缓存了一个用户的主页,他的朋友发布了一个新的提要,我希望缓存过期,下次他再次访问主页时,应用程序会联系数据库,获取新提要并缓存它

我在数据库中使用memcache、PHP和MySQL。 我有一个名为
friends
feeds
users
的表

缓存每个用户的朋友是否有效?当该用户发布提要时,我的应用程序会获取他/她的朋友并使用他们的用户ID缓存通知,以便当这些朋友登录应用程序时,在每个页面检查是否有要采取行动的通知(在这种情况下,删除缓存中的主页)

问候,,
结果

编写一个类,该类处理所有数据库查询,缓存表,并对缓存表而不是数据库执行查询。每次对表执行插入或更新操作时,都要更新缓存。

分析应用程序并找到访问数据的位置,这些数据的获取(或计算)成本很高。这些地方是使用memcached的好地方,除非您的写操作比读操作要多(您可能需要更新缓存的频率比使用它的频率更高)


缓存您曾经访问过的所有内容很可能只会导致一个相当完整的memcached,其中大部分存储的数据很少被访问(同时可能会将您实际上应该缓存的内容从缓存中推出)。在许多情况下,您不应该使用memcached作为键值形式的数据库的1:1副本。

甚至在开始服务器端优化之前,您应该运行并尝试获得评级。仔细看看你的JavaScript。如果您使用的是jQuery,那么去掉它将大大提高站点的整体性能。前端优化通常更为重要

下一步是优化清理服务器端代码。尝试测试SQL查询。查看是否缺少一些索引。然后使用在PHP端进行一些评测。看看瓶颈在哪里


然后才开始处理缓存。至于Memcached,除非您的网站运行在服务器集群之上,否则您不需要它。地狱。。它甚至可能是有害的。如果您的站点位于单个框中,您将获得更好的结果,与Memcached不同,Memcached不是按性质分发的。

好吧,在我的情况下,我几乎必须在每个页面上获取好友列表,所以我想这不会是一个太大的问题。但是在主页上你是对的,缓存整个页面并不是那么明智。谢谢你的回答。那么,我们在谈论多少朋友?几千?一百万?查询包含多少个联接?
WHERE
子句中显示多少列?你可以用几行代码构建一个穷人的查询日志,记录时间(这比xdebug更轻松,也可以告诉你哪些查询比其他查询花费的时间更长)。我们说的是每个用户平均有500个朋友,因为我把它限制在1000个p/u。现在我有4台3.6GHZ 8核PC,每台32 GB内存。我不使用联接从表中查找朋友。首先,我从uid1=(user_id)和active=1的朋友中选择uid2,然后第二次转到数据库,从
users
表中检索这些朋友,并实例化对象。Hm,我可能会使用
SELECT*from users-JOIN-friends.uid2=users.id其中friends.uid1=(user\u id)和friends.active=1
。我怀疑单次连接比两次查询更昂贵。在任何情况下,这两个数字都不应该成为特定的性能瓶颈(我目前正在尝试优化一个PHP应用程序,在这个应用程序中,我们经常有三个或更多表的连接——这是显而易见的)。但正如前面提到的,个人资料!根据我的经验,在试图猜测性能问题所在时,至少95%的情况下你猜错了。我目前正在研究你的建议。将我的查询记录到文件中。我使用的是microtime,但在某些情况下,它会返回4.548251352E-5这样的数字,我不熟悉time、microtime和fopen函数。以前从未使用过。我觉得我很幸运,我从来都不喜欢使用连接和联合,尽管在某些情况下我不得不使用它们。不管怎样,你的猜测理论是对的。有时情况并非如此,因此在这些情况下,日志记录和调试是最好的方法。谢谢,我读过一本名为《Pro PHP应用程序性能》的书,正因为如此,我知道您向我推荐的方法,但我找不到任何关于如何使用memcached高效缓存的方法。我想我还是要使用Xdebug,看看哪些函数等使用了最多的资源,并对它们进行优化。是的,我将在集群上运行我的应用程序,就像你说的,APC不是这里最好的工具