【问题标题】:Choosing a PHP caching technique: output caching into files vs. opcode caching选择 PHP 缓存技术:输出缓存到文件与操作码缓存
【发布时间】:2011-06-16 20:34:56
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: php performance caching apc eaccelerator


    【解决方案1】:

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

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

    如果我有两个以上的服务器,我喜欢使用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 请求...

    等等……

    【讨论】:

      【解决方案2】:

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

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

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

      希望这会有所帮助。

      【讨论】:

        【解决方案3】:

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

        但要注意 1):

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

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

        问候, /t

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          【解决方案5】:

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

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

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

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

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

          【讨论】:

          • 自从我投反对票以来,您的答案有所改进。冷静下来。淡化 redis 狂热分子主义。
          • 不,我无法冷静下来,你在投票给我(没有任何正当理由)。如果您有正当理由这样做,我可以理解。但我正在努力帮助 PHPGuy,但我得到的只是被否决。
          • @Dan Grossman:那么您是建议使用 APC 和代码缓存 ob_start,还是单独使用 APC?我现在读了你的答案,如果你有兴趣回答,我在这里问了另一个关于类似主题的问题:stackoverflow.com/questions/9977442/…
          • 如果您要缓存整个页面,那么在这样的代码中进行缓存可能是效率最低的方式。您可能希望在 Web 服务器级别进行缓存,可能是通过在应用程序服务器前面粘贴一个快速缓存代理(如 Varnish)。
          • @DanGrossman,实际上,如果操作码由于上面的输出缓存层而只解析一次,那么缓存操作码的意义何在?
          猜你喜欢
          • 2011-08-20
          • 1970-01-01
          • 2019-07-19
          • 2012-04-29
          • 1970-01-01
          • 2014-05-01
          • 2012-01-19
          • 2011-06-13
          • 1970-01-01
          相关资源
          最近更新 更多