2011-01-27 112 views
8

我听到两个缓存技术PHP代码:选择一个PHP缓存技术:输出缓存后的文件与指令缓存

  1. 当PHP脚本生成它存储到本地文件输出。当再次调用该脚本时,检查是否存在具有前一个输出的文件,如果为true,则返回该文件的内容。它主要是在玩“输出缓冲区”的情况下完成的。这样的东西在this文章中有描述。

  2. 使用一种opcode缓存插件,其中编译的PHP代码存储在内存中。这一个最受欢迎的是APC,也是电子加速器。

现在的问题是使用这两种技术或仅使用其中一种技术是否有意义。我认为第一种方法在实现中有点复杂且耗时,而第二种方法似乎是一个简单的方法,只需要安装模块。

我在Ubuntu/Debian上使用PHP 5.3(PHP-FPM)。

顺便说一句,有没有其他方法来缓存PHP代码或输出,我没有在这里提到?他们值得考虑吗?

回答

7

你应该总是有一个像APC一样的操作码缓存。其目的是加速解析代码,并将在未来的版本中捆绑到PHP中。目前,这是一个简单的安装在任何服务器上,不需要你写或修改任何代码。

但是,缓存操作码不会做任何事情来加速您的代码的实际执行。您的瓶颈通常是花在与数据库交谈或从磁盘读取数据上的时间。缓存程序的输出可以避免不必要的资源使用,并且可以加快响应速度。

您可以在堆栈中的许多不同位置以许多不同方式执行输出缓存。正如你所建议的,你可以通过缓冲输出,写入文件,以及在后续请求中读取该文件来完成。

尽管如此,仍然需要在每个请求上执行您的PHP代码。您也可以在Web服务器级别缓存输出以跳过。制定一套mod_rewrite规则将允许Apache在静态文件存在时提供静态文件而不是PHP代码,但是由于您的PHP代码不会运行,所以您必须手动或使用计划任务重新生成缓存版本每个请求都这样做。

您也可以在Web服务器前面粘贴代理并使用它来缓存输出。 Varnish现在是一个流行的选择,并且可以在缓存上提供每秒数百倍的请求,而不是在同一台服务器上运行PHP脚本。缓存是在代理级创建和配置的,因此当它到期时,请求会传递到您的脚本,该脚本通常会生成新版本的页面。

+0

你downvoting我,但你的信息是错误的!!!! – Alfred 2011-01-27 21:35:45

+0

你已经改善了你的答案,因为我低估了它。冷静。并调低redis fanboy-ism。 – 2011-01-27 21:37:14

0

很多时候,对于PHP Web应用程序来说,数据库是瓶颈。因此,您可以做的最好的事情之一是使用memcached将结果缓存在内存中。您还可以使用类似xhprof的文件来分析您的代码,并真正拨打最耗时的内容。

0

是的,这些是两种不同的缓存技术,并且你已经正确地理解了它们。

但要注意:1):如果内容改变迅速

1)高速缓存脚本生成的输出到文件或代理可以呈现问题 。

2.)x-cache也存在,很容易在ubuntu上安装。

问候, /吨

0

我不知道这是否真的会工作,但我遇到性能问题想出了一个PHP脚本,我有。我有一个纯文本文件,它将数据存储为标题和URL选项卡,每个记录用新行分隔。我的脚本抓取每个URL处的文件并将其保存到它自己的文件夹中。
然后,我有另一个页面实际显示本地文件(在本例中为图片),并使用preg_replace()将每行的输出从远程url更改为相对值,以便服务器可以显示它们。我的制表符分隔文件现在超过1 MB,并且需要几秒钟才能完成preg_replace(),所以我决定查看输出缓存。我找不到任何明确的,所以我想我会尝试我自己的手,这是我想出来的:

当我请求页面查看本地东西时,我尝试从一个变量读取它全球范围。如果这是空的,则可能是该应用程序尚未运行,并且此全局需求已填充。如果它是空的,请从输出文件(纯文本显示要输出的所有内容的纯文本文件)中读取并将内容保存到全局变量中,然后显示全局输出。
现在,当脚本运行以更新制表符分隔的文件时,它会更新输出文件和全局变量。这样,脚本中实际执行缓慢运行的部分仅在数据更新时运行。

现在我还没有尝试过这个,但理论上,这应该会提高我的性能很多,虽然它实际上仍然运行脚本,但数据永远不会过期,我应该得到更好的负载时间。

希望这会有所帮助。

2

对于我来说,你知道,optcache,filecache ..等仅用于减少数据库调用。 他们不能加快你的代码。但是,他们通过使用缓存为访问者提供服务来改善页面加载。

对我来说,当我需要缓存小部件时,APC足够用于VPS或专用服务器,$对象来保存mySQL服务器。

如果我有2个以上的服务器,我喜欢使用Memcache,他们很擅长使用内存缓存。然而,这取决于你,不是每个人都喜欢memcached,也不是每个人都喜欢APC。

为了缓存整个网页,我运行了很多wordpress,并且在一些缓存插件(如W3Total Cache)上使用了APC,Memcache,Filecache。我看到(我自己的exp):Filecache适用于缓存整个网站,内存缓存适用于缓存$ object

如果你的硬盘速度很慢,Filecache会增加你的CPU,而且如果你不喜欢内存缓存,你的VPS上有足够的内存。

SSD硬盘读写文件的速度会非常快,但内存总是更快。然而,人类看不到这些速度有什么区别。你只能在你的项目和你的服务器(RAM,HDD)上选择一种方法,或者你在共享虚拟主机上?

如果我在共享主机上,没有root权限,没有php.ini,我喜欢使用phpFastCache,它只是一个简单的文件缓存方法,只有set,get,stats,delete。

另外,我喜欢使用.htaccess来缓存静态文件,如图像,js,css或html标题。他们将帮助访问者加快您的页面,并节省您的服务器带宽。

而且如果你可以使用.htaccess重定向到静态.html缓存,如果你缓存整个页面是一件好事。

在未来,APC或某些Optcache将捆绑成PHP版本,但我相信所有的缓存不能加快你的代码,他们使用:

  1. 减少数据库/查询电话。
  2. 通过使用缓存来提高页面加载的速度。
  3. 保存您的API交易(例如冰)或卷曲的请求......

等等