使用PHP缓存以消除MySQL的压力

时间:2009-10-21 09:07:33

标签: php mysql caching

我正在为我的应用程序编写一个Web服务,并希望了解处理可能获得的大量请求的最佳方法。很多数据可能不会在一天内发生变化,但是我正在编写的特定脚本会产生3个MySQL查询,考虑到数据可能与上一次对脚本的请求相同,如果它不是同样的,这没什么大不了的。

如果我将输出XML / JSON保存到文件然后在一天内将其提供给请求者,然后在第二天的第一个请求中覆盖它,性能会好得多吗?这样做的最佳方式是什么?

我知道Joomla和phpBB以及其他MySQL密集型应用程序都使用缓存,以便不会生成尽可能多的MySQL查询,所以这就是让我思考的问题。

编辑 - 忘记提及我在Windows / IIS 7.0上

4 个答案:

答案 0 :(得分:8)

在您需要之前,请不要使用缓存。 Memcache经常是一个不成熟的优化,应该是你的最后一个,而不是第一个。添加这种缓存可能会导致复杂的一致性问题。

数据库本质上并不慢,当然也不比从平面文件加载一堆缓存数据慢。但是滥用它们可能会很慢。例如,如果您的每个页面查询之一写入MyISAM表,或者执行无索引查询,或者您的某个查询只是复杂而困难。首先通过修复架构来攻击这些情况。

答案 1 :(得分:6)

您应该查看memchached:通过PHP的memcachememcached

访问它
  

Memcache模块为memcached,高效缓存守护程序提供了方便的过程和面向对象的接口,该守护程序专门用于减少动态Web应用程序中的数据库负载。

它的设计完全符合您的需求,并被许多高性能Web应用程序使用。

开发Memcached是为了提高LiveJournal.com的速度,LiveJournal.com是一个已经为100万用户每天做2000万次动态页面浏览的网站,拥有一堆网络服务器和一堆数据库服务器。 memcached的引入极大地降低了数据库负载。

注意
PHP中有两(2)个客户端库。有关这方面的更多讨论可以在serverfaul.com上找到:memcache-vs-memcached这里是comparison

答案 2 :(得分:3)

快速而肮脏的方式就是这样。

1. create a cachefilename for this specific url
2. check if such a file exists in the cache directory and if it is younger than n minutes

2.1 if not: 
2.2 // business logic goes here => Save output e.g. in a variable $output
2.3 save contents of $output in cachefilename
2.4 echo $output

3. if so:

3.1 $output = file_get_contents(cachefilename)
3.2 echo $output

它可能不如memcache或memcached那么优雅,但你几乎可以在任何地方使用它。

答案 3 :(得分:1)

Memcached很棒,但对你的意图可能有些过分。像Martin提出的基于文件的缓存方法可以正常工作。 PHP的文件级别有许多现成的缓存库。