PHP ob_start vs opcode APC,解释差异和现实世界的用法?

时间:2012-04-02 13:33:03

标签: php caching apc ob-start

前提:我不是要重新发明轮子,我只是想了解。

输出缓存可以轻松实现:

//GetFromMyCache returns the page if it finds the file otherwise returns FALSE
if( ($page = GetFromMyCache($page_id)) !== FALSE )
{
   echo $page; //sending out page from cache
   exit();
}

//since we reach this point in code, it means page was not in cache
ob_start(); //let's start caching

//we process the page getting data from DB

//saving processed page in cache and flushing it out
echo CachePageAndFlush(ob_get_contents());

another article以及another answer中解释得很清楚。

但接下来是APC (默认情况下会包含在PHP6中)。

  1. APC是否曾经安装在服务器上的模块,现有的 PHP代码运行得更快无需修改

    APC 是否自动

  2. 那么,为什么会有像apc_add这样的函数?

    我们如何使用APC缓存整个页面?

  3. 安装APC后,我是否还需要执行任何缓存?

  4. 如果APC要为托管服务提供商节省资金,他们为什么不安装它? (我的意思是他们应该竞相安装它,但我不认为这种情况发生了。)

    安装APC对这些托管服务提供商有缺点吗?

3 个答案:

答案 0 :(得分:4)

APC是操作码缓存:

  

Alternative PHP Cache(APC)是一个免费且开放的操作码缓存   PHP。它的目标是为其提供一个免费,开放,强大的框架   缓存和优化PHP中间代码。

这与模板缓存(您演示的内容)不同,并且对输出缓冲影响不大。这不是一回事。

操作码缓存意味着在解释之后缓存PHP代码。这可以是任何代码片段(不一定是输出HTML的东西)。例如,您可以将类和模板引擎本身粘贴在操作码缓存中。这将大大加快您的代码速度,因为PHP解释器不需要再次“解释”您的代码,它只需从缓存中加载“解释”版本。

请不要将输出缓冲与缓存混淆。有许多级别的缓存,例如,您可能熟悉的两种最常见的缓存。

缓存会话

这是一个非常基本的版本,它是一个存储一些设置的cookie。您只执行一次“计算”设置的代码(当用户登录时),并且对于会话的其余部分,您使用cookie中的“缓存”设置。

缓存渲染的模板

当需要生成一次但不经常更改的页面时,会执行此操作。例如,“每日特价”页面,它是一个模板。您只生成一次,然后从缓存中提供“呈现”页面。

这些都不使用APC

答案 1 :(得分:3)

  

APC能让PHP自己运行得更快吗?

是。在某种方式。但好处却大不相同。

  

使用APC时,我是否还需要缓存呈现的HTML?

字节码 NOT 与生成的HTML一样。它与常规PHP脚本相同。 即使启用了APC,PHP也必须处理数据并呈现HTML。

我希望你现在明白其中的差异。

APC缓存提供 字节码缓存和基于内存的存储来存储用户数据。
因此,您也可以使用它来存储一些用户定义的数据 并存储整个呈现的页面(我不明白你在这里的困惑 - 你正在讨论的'页'数据类型是什么?ob结果不仅仅是一个常规字符串吗?)。
但是,生成的HTML的缓存并不像您想象的那么容易。

过早优化是一切罪恶的根源 只有在有理由的情况下才开始优化您的网站。

  

为什么Web Hosters等待安装APC?

有几个原因。但是一个就足够了 - 字节码缓存不会为通常基于PHP的丑陋主页电子商务网站带来任何利润。

答案 2 :(得分:1)

APC缓存字节码。 PHP会在请求或包含文件时将您编写的源代码转换为这些代码,然后将其删除。使用APC,字节码保持不变。

ob_start打开输出缓冲区。它可以用来缓存程序代码的一个效果,即它打印的文本。

如果您希望程序运行得更快并且消耗更少的CPU能力,请使用APC。它对数据库吞吐量没有影响。

如果您只想时不时地运行程序并且只是静态地为其最后一个输出提供服务,则缓存ob_start输出。这节省了数据库吞吐量,代价是信息新鲜度和个性化。

当每个页面请求传达新信息或特定于用户的信息时,APC是好的。

如果您正在运行一些重量级计算或数据访问,则缓存ob_start输出,并且每个人都可以获得相同的非常新鲜的输出。