用PHP缓存以加快速度

时间:2014-01-31 00:09:29

标签: php apache caching

我在VPS上运行应用程序(基于PHP& MySql)。我有文章表,其中有数百万条记录。每当用户登录时,我都会显示每个部分的最后50条记录。

所以每次使用登录或刷新页面时都会执行sql查询来获取这些记录。现在网站上有很多用户,因为我的网页速度已大幅下降。

我做了一些关于缓存的研究,发现我可以根据section,no读取mysql数据。例如(第1条和第1条 - 第50条)。将其存储在磁盘文件缓存/ md5(部分号)中。

然后将来当我收到该部分的请求时,只需从cache / md5获取数据(部分号)。

以上解决方案看起来很棒。但在我开始之前,我真的想澄清一下专家们的疑虑。

  • 它会真正加快我的应用程序(我知道磁盘比mysql查询更快但不知道多少......)
  • 我目前在我的页面上使用分页,如显示前5篇文章,当用户点击“显示更多”然后显示接下来的5篇文章等...这可以很容易地在mysql查询中。如果我将所有记录(50)存储在缓存文件中,我不知道应该怎么做。如果有人可以分享一些很棒的信息。
  • 任何替代解决方案,如果您认为上述情况不起作用。
  • 如果您知道,任何开源应用程序。 (PHP)

提前谢谢

此致 拉吉

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,每个页面加载导致运行2个以上的查询。值得庆幸的是,他们的查询非常相似,因此缓存(如您的情况)非常有用。

您有几个选择:

  1. 将数据库卸载到同一网络上的单独VPS,以根据需要上下扩展

  2. 缓存来自每个查询的数据,并在点击数据库之前尝试从缓存中检索

  3. 最后我们选择了两者,安装Memecached及其php扩展用于查询缓存。 Memecached是一个键值存储(很像PHP的关联数组),其存储的每个值都以秒为单位设置到期时间。由于它将所有内容存储在RAM中,因此易失性高速缓存数据的权衡是非常快的读/写时间,远远优于文件系统。

    我们的实现基本上是通过过滤器运行每个查询;如果是select语句,则通过将memecached键设置为“namespace_ [md5 of query]”来缓存它,并将值设置为包含所有结果行的数组的序列化版本。缓存120秒(3分钟)应该足以帮助解决服务器负载问题。

答案 1 :(得分:0)

如果Memecached不是一个可行的解决方案,请将每个部分的所有50篇文章存储为RSS源。您可以一次性提取所有文章,使用SimpleXML抓取每篇文章的内容,并根据网站设计将其包装在网站的文章模板HTML中。一旦数据存在,使用CSS样式仅显示X文章,使用JavaScript进行分页。

由于两个进程同时修改同一个文件是一个坏主意,因此向一个部分添加一个新故事会触发一个事件,这会将故事添加到消息队列中。该消息队列将由一个工作人员处理,该工作人员使用SimpleXML执行两个连续的操作:

  1. 删除XML文件末尾最旧的故事

  2. 将消息队列中的新故事添加到XML文件的顶部

  3. 如果您愿意,根据部分提供的RSS Feed可以是一个面向公众的功能。