8

我听说过 PHP 代码的两种缓存技术:

  1. 当 PHP 脚本生成输出时,它会将其存储到本地文件中。当再次调用该脚本时,它会检查具有先前输出的文件是否存在,如果为 true,则返回该文件的内容。它主要是通过“输出缓冲区”来完成的。这篇文章中描述了这样的事情。

  2. 使用一种操作码缓存插件,编译后的 PHP 代码存储在内存中。其中最受欢迎的是 APC,也是 eAccelerator。

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

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

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

4

5 回答 5

7

您应该始终拥有像 APC 这样的操作码缓存。它的目的是加快代码的解析速度,并将在未来的版本中捆绑到 PHP 中。目前,它是在任何服务器上的简单安装,不需要您编写或更改任何代码。

但是,缓存操作码并不能加速代码的实际执行。您的瓶颈通常是花费在与数据库通信或从磁盘读取/读取数据上的时间。缓存程序的输出可以避免不必要的资源使用,并且可以将响应速度提高几个数量级。

您可以在堆栈的许多不同位置以多种不同方式进行输出缓存。正如您所建议的,您首先可以在自己的代码中执行此操作,方法是缓冲输出,将其写入文件,并在后续请求中从该文件中读取。

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

您还可以在您的 Web 服务器前面放置一个代理,并使用它来缓存输出。Varnish 是当今流行的选择,每秒可以处理比在同一服务器上运行 PHP 脚本的 Apache 多数百倍的缓存请求。缓存是在代理级别创建和配置的,因此当它过期时,请求会传递到您的脚本,该脚本会正常运行以生成页面的新版本。

于 2011-01-27T21:34:28.297 回答
2

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

对我来说,当我需要缓存小部件、$object 来保存我的 mySQL Server 时,APC 对 VPS 或专用服务器来说已经足够好了。

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

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

如果你的硬盘驱动器很慢,文件缓存会增加你的 CPU,如果你的 VPS 上没有足够的内存,内存缓存会很糟糕。

SSD HDD 读取/写入文件的速度非常好,但内存总是更快。但是,人类看不出这些速度之间有什么区别。您只根据您的项目和服务器(RAM、HDD)选择一种方法,还是在共享虚拟主机上?

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

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

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

将来,APC 或一些 Optcache 将被捆绑到 PHP 版本中,但我确信所有的缓存都不能加速你的代码,它们用于:

  1. 减少数据库/查询调用。
  2. 通过使用缓存服务来提高页面加载速度。
  3. 保存您的 API 事务(如 Bing)或 cURL 请求...

ETC...

于 2013-04-30T20:24:00.833 回答
0

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

但要注意1):

1.) 如果内容快速变化,缓存脚本生成的输出到文件或代理可能会出现问题。

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

问候,/t

于 2011-01-27T21:57:46.037 回答
0

很多时候,当谈到 PHP Web 应用程序时,数据库是瓶颈。因此,您可以做的最好的事情之一就是使用memcached将结果缓存到内存中。您还可以使用诸如xhprof 之类的东西来分析您的代码,并真正了解花费最多时间的内容。

于 2011-01-27T21:53:44.003 回答
0

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

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

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

希望这可以帮助。

于 2012-03-08T21:47:33.017 回答