我听说过PHP代码的两种缓存技术:
当PHP脚本生成输出时,它会将其存储到本地文件中。再次调用脚本时,它会检查具有先前输出的文件是否存在,如果为true则返回此文件的内容。它主要是通过播放“输出缓冲区”来完成的。 this文章中描述了这样的事情。
使用一种操作码缓存插件,编译的PHP代码存储在内存中。最受欢迎的是APC,也是eAccelerator。
现在的问题是,使用这两种技术还是只使用其中一种技术是否合理。我认为第一种方法在实现中有点复杂和耗时,当第二种方法看起来很简单时你只需要安装模块。
我在Ubuntu / Debian上使用PHP 5.3(PHP-FPM)。
BTW,有没有其他方法来缓存PHP代码或输出,我在这里没有提到?他们值得考虑吗?答案 0 :(得分:7)
您应该始终拥有像APC一样的操作码缓存。它的目的是加速代码的解析,并将在未来的版本中捆绑到PHP中。目前,它是在任何服务器上的简单安装,不需要您编写或更改任何代码。
但是,缓存操作码对加速代码的实际执行没有任何作用。您的瓶颈通常是与数据库通信或从磁盘读取数据所花费的时间。缓存程序的输出可以避免不必要的资源使用,并可以加快响应的数量级。
您可以在堆栈的许多不同位置以多种不同的方式执行输出缓存。您可以通过缓冲输出,将其写入文件以及在后续请求中从该文件中读取,按照您的建议,首先使用您自己的代码。
但仍需要在每个请求上执行PHP代码。您可以在Web服务器级别缓存输出以跳过该输出。制定一组mod_rewrite规则将允许Apache在存在时提供静态文件而不是PHP代码,但是您必须手动或使用计划任务重新生成缓存版本,因为您的PHP代码将不会运行每个要求都这样做。
您还可以在Web服务器前面添加代理,并使用它来缓存输出。如今,Varnish是一种流行的选择,并且每秒可以提供数百倍的缓存请求,而不是Apache在同一台服务器上运行PHP脚本。缓存是在代理级别创建和配置的,因此当它到期时,请求将传递到您的脚本,该脚本通常会生成新版本的页面。
答案 1 :(得分:2)
你知道,对我来说,optcache,filecache等只用于减少数据库调用。 他们无法加速您的代码。但是,它们通过使用缓存为访问者提供服务来改善页面加载。
对我来说,当我需要缓存小部件时,APC对于VPS或专用服务器来说已经足够了,$ object可以保存我的mySQL服务器。
如果我有两个以上的服务器,我喜欢使用Memcache,他们擅长使用内存来缓存。然而,这取决于你,不是每个人都喜欢memcached,而不是每个人都喜欢APC。
对于缓存整个网页,我运行了很多wordpress,我在一些缓存插件上使用了APC,Memcache,Filecache,比如W3Total Cache。而且我看到(我自己的exp):Filecache适合缓存整个网站,内存缓存有利于缓存$ object
如果你的硬盘很慢,Filecache会增加你的CPU,如果你的VPS上没有足够的内存,内存缓存会很糟糕。
SSD HDD的读取/写入文件速度非常快,但内存总是更快。但是,人类看不出这些速度有什么区别。您只选择一个基于您的项目和服务器(RAM,HDD)的方法,或者您是在共享的虚拟主机上?
如果我在共享主机上,没有root权限,没有php.ini,我喜欢使用phpFastCache,这是一个简单的文件缓存方法,只有set,get,stats,delete。
另外,我喜欢使用.htaccess来缓存静态文件,如图像,js,css或html标头。它们将帮助访问者加快页面速度,并节省服务器带宽。
如果你可以使用.htaccess重定向到静态.html缓存,如果你缓存整个页面是件好事。
将来,APC或一些Optcache将捆绑到PHP版本,但我确信所有缓存都无法加速您的代码,他们用来:
等...
答案 2 :(得分:0)
很多时候,当谈到PHP Web应用程序时,数据库是瓶颈。因此,您可以做的最好的事情之一是使用memcached将结果缓存到内存中。您还可以使用xhprof之类的内容来分析您的代码,并真正拨打最耗费时间的内容。
答案 3 :(得分:0)
是的,这是两种不同的缓存技术,你已经正确理解它们了。
但请注意1):
1。)缓存脚本生成的输出到文件或代理可能会产生问题 如果内容迅速变化。
2。)x-cache也存在,并且易于在ubuntu上安装。
的问候, /吨
答案 4 :(得分:0)
我不知道这是否真的有用,但我遇到了一个PHP脚本的性能问题。我有一个纯文本文件,将数据存储为标题和URL选项卡,每个记录用新行分隔。我的脚本抓取每个URL上的文件并将其保存到自己的文件夹中
然后我有另一个页面实际显示本地文件(在这种情况下,图片),我使用preg_replace()
将每行的输出从远程URL更改为相对的一个,以便它可以显示服务器。我的制表符分隔文件现在超过1 MB,并且需要几个SECONDS来执行preg_replace()
,所以我决定查看输出缓存。我找不到任何确定的东西,所以我想我会亲自动手,这就是我想出的:
当我请求页面在本地查看内容时,我尝试从全局范围内的变量中读取它。如果这是空的,则可能是此应用程序尚未运行并且此全局需求已填充。如果它是空的,则从输出文件中读取(简单的html文件,字面上显示要输出的所有内容)并将内容保存到全局变量,然后显示全局的输出。
现在,当脚本运行以更新制表符分隔文件时,它会更新输出文件和全局变量。这样,实际执行缓慢运行的内容的脚本部分仅在数据更新时运行。
现在我还没有尝试过这个,但从理论上讲,这应该会提高我的性能,虽然它确实仍然运行脚本,但数据永远不会过时,我应该得到更好的加载时间
希望这有帮助。