选择PHP缓存技术:将输出缓存到文件还是opcode缓存?

8
我听说有两种用于PHP代码的缓存技术:
1. PHP脚本生成输出后将其存储在本地文件中。当再次调用该脚本时,它会检查以前输出的文件是否存在,如果存在,则返回该文件的内容。这通常是通过操作“输出缓冲区”来完成的。类似这样的东西在这篇文章中有介绍。
2. 使用某种opcode缓存插件,将编译后的PHP代码存储在内存中。其中最流行的是APC,还有eAccelerator。
现在的问题是,使用这两种技术是否有意义,还是只使用其中一种即可。我认为第一种方法在实现过程中有点复杂和耗时,而第二种方法似乎很简单,只需要安装模块即可。
我在Ubuntu/Debian上使用PHP 5.3(PHP-FPM)。
顺便问一下,还有没有其他缓存PHP代码或输出的方法,我没有在这里提到?值得考虑吗?
5个回答

7
您应该始终使用像APC这样的opcode缓存。它的目的是加速您代码的解析,并将在未来版本中捆绑到PHP中。目前,在任何服务器上都可以简单安装,不需要编写或更改任何代码。
但是,缓存opcode并不会加速实际执行代码的速度。通常情况下,瓶颈是花费在与数据库交互或从磁盘读取/写入的时间。缓存程序输出可以避免不必要的资源使用,并且可以将响应速度加快数倍。
您可以在各种不同的地方沿着整个堆栈进行输出缓存。您可以在自己的代码中首先执行它,如您所建议的,通过缓冲输出、将其写入文件并在后续请求中从该文件中读取。
然而,这仍然需要在每个请求上执行您的PHP代码。您可以在Web服务器层级别缓存输出以跳过此过程。构建一组mod_rewrite规则将允许Apache在它们存在时服务于静态文件而不是PHP代码,但您将不得不手动或使用定期任务重新生成缓存版本,因为您的PHP代码不会在每个请求上运行以此来完成。
您也可以在Web服务器前面添加代理并使用它来缓存输出。Varnish是当今流行的选择,使用缓存比在同一服务器上运行PHP脚本的Apache可以提供数百倍的请求速度。缓存是在代理级别创建和配置的,因此当其过期时,请求将通过到达您的脚本,该脚本会像通常一样运行以生成页面的新版本。

你在我给你的回答点踩之后改进了它。冷静一点。并且要减少对Redis的狂热。 - Dan Grossman
不,我无法冷静下来,你正在给我点踩(没有任何正确的理由)。如果你有有效的理由这样做,我可以理解。但是我正在尝试帮助PHPGuy,却只得到了负面评价。 - Alfred
@Dan Grossman:你是建议同时使用APC和代码缓存ob_start,还是只使用APC?我现在已经阅读了你的答案,如果你有兴趣回答类似主题的另一个问题,我在这里提出了另一个问题:https://dev59.com/wGLVa4cB1Zd3GeqPuTuG - Marco Demaio
如果您要缓存整个页面,那么在代码中这样做是最低效的方式。您应该在 Web 服务器层级别上进行缓存,可能是通过在应用程序服务器前插入快速缓存代理(如 Varnish)来实现缓存。 - Dan Grossman
@DanGrossman,实际上,在它上方的输出缓存层之下只解析一次操作码,那么缓存操作码的意义是什么? - Pacerier

2
你知道,对我来说,optcache、filecache等只是用于减少数据库调用。它们不能加速你的代码。然而,它们通过使用缓存为访问者提供服务,可以提高页面加载速度。

对我来说,当我需要缓存小部件、$object以保存我的MySQL服务器时,APC已经足够好了。

如果我有超过2个服务器,我喜欢使用Memcache,它们擅长使用内存进行缓存。但这取决于你自己,不是每个人都喜欢memcached,也不是每个人都喜欢APC。

对于整个网页的缓存,我运行了很多WordPress,并在一些缓存插件(如W3Total Cache)中使用了APC、Memcache、Filecache。根据我的经验:Filecache适合缓存整个网站,内存缓存适合缓存$object。

如果你的硬盘速度较慢,Filecache会增加你的CPU负担;如果你的VPS上没有足够的内存,内存缓存将非常糟糕。

一种SSD硬盘将会拥有非常快的读写速度,但内存总是更快。然而,人类无法看到这些速度之间的差异。你只能基于你的项目和服务器(RAM、HDD)选择一种方法,或者你在共享网络托管中吗?
如果我正在使用共享托管且没有根权限或php.ini文件,则我喜欢使用phpFastCache,它是一个简单的文件缓存方法,只包含设置、获取、统计和删除功能。
此外,我喜欢使用.htaccess来缓存静态文件,如图片、js、css或通过HTML头文件。它们将帮助访问者加速您的页面,节省您的服务器带宽。
如果您可以使用.htaccess重定向到静态.html缓存,那么缓存整个页面将是一个很好的事情。
将来,APC或一些Optcache将打包进PHP版本中,但我确定所有缓存都不能加速您的代码,它们用于:
1. 减少数据库/查询调用。 2. 通过使用缓存进行页面加载以提高速度。 3. 保存您的API交易(如Bing)或cURL请求等。
等等...

0

我不确定这是否有效,但我遇到了一个PHP脚本的性能问题。我有一个纯文本文件,其中存储了标题和URL,每个记录由换行符分隔。我的脚本获取每个URL的文件并将其保存到自己的文件夹中。
然后我有另一个页面,实际上显示本地文件(在这种情况下是图片),我使用preg_replace()来更改每行的输出,从远程URL更改为相对路径,以便服务器可以显示它。我的制表符分隔文件现在超过1 MB,并且执行preg_replace()需要几秒钟,因此我决定研究输出缓存。我找不到任何明确的东西,所以我决定自己尝试一下,以下是我的解决方案:

当我请求本地查看页面时,我尝试从全局范围内的变量中读取它。如果为空,可能是因为此应用程序尚未运行,需要填充此全局变量。如果为空,则从输出文件(纯HTML文件,直接显示所有内容)中读取并将内容保存到全局变量中,然后显示全局变量的输出。
现在,当脚本运行以更新制表符分隔的文件时,它会更新输出文件和全局变量。这样,只有在更新数据时才会运行实际运行缓慢的部分脚本。
现在我还没有尝试过这个方法,但理论上来说,这应该大大提高我的性能,虽然它确实仍然运行脚本,但数据永远不会过时,我应该得到更好的加载时间。
希望这可以帮助您。

0
在 PHP 网络应用程序中,数据库往往是瓶颈所在。因此,你可以使用 memcached 将结果缓存在内存中,这是你能做的最好的事情之一。你还可以使用类似 xhprof 的工具来分析你的代码,真正找出花费时间最多的部分。

如果你只有一个盒子,我认为使用memcached会浪费网络开销。只需使用APC缓存数据即可(http://php.net/manual/en/function.apc-add.php)。 - Alfred

0

是的,这两种缓存技术是不同的,而且您已经正确理解了它们。

但要注意以下问题:

1)将脚本生成的输出缓存到文件或代理可能会在内容快速更改时出现问题。

2)x-cache也存在,并且在Ubuntu上很容易安装。

祝好, /t


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接