PHP ob_start与操作码APC,解释差异和现实世界中的用法


PHP ob_start vs opcode APC, explain differences and real world usage?

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

输出缓存可以很容易地实现:

//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());

在另一篇文章中解释得很好,在另一个答案中也解释得很清楚。

但随后出现APC(默认情况下将包含在PHP6中)。

  1. APC是一个模块吗?一旦安装在服务器上,现有的PHP代码将在不进行修改的情况下运行得更快?

    APC是自动吗?

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

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

  3. 安装APC后,我是否还需要对自己进行任何缓存?

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

    安装APC是否对这些托管提供商不利?

APC是操作码缓存:

Alternative PHP Cache(APC)是一个免费开放的操作码缓存,用于PHP。其目标是为缓存和优化PHP中间代码。

这与模板缓存(您正在演示的内容)不同,它对输出缓冲几乎没有影响。这不是一回事。

操作码缓存意味着在PHP代码被解释后对其进行缓存。这可以是任何代码片段(不一定是输出HTML的东西)。例如,您可以将类和模板引擎本身粘贴在操作码缓存中。这将大大加快您的代码,因为PHP解释器不需要";解释";您的代码,它可以简单地加载";解释的";版本。

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

缓存会话

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

缓存渲染的模板

当一个页面需要生成一次,但不会经常更改时,就会执行此操作。例如;每日特价商品";页面,这是一个模板。你只生成一次,然后提供";呈现";页面。

这些都不使用APC

APC是不是让PHP自己运行得更快?

是的。在某种程度上但收益却大不相同。

当使用APC时,我还需要缓存渲染的HTML吗?

字节码与生成的HTML不同。它与常规PHP脚本是相同的程序。即使启用了APC,PHP也必须处理数据和呈现HTML。

我希望你现在明白其中的区别。

APC缓存提供字节码缓存和基于内存的存储来存储用户数据
因此,您还可以使用它来存储一些用户定义的数据
并存储整个渲染的页面(我不理解你在这里的困惑——你所说的"页面"数据类型是什么?ob结果不是只是一个正则字符串吗?)
但是,缓存生成的HTML并不像您想象的那么容易

过早的优化是万恶之源
只有当你有理由的时候才开始优化你的网站。

为什么网络主机等待安装APC?

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

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

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

如果你想让你的程序运行得更快,消耗更少的CPU功率,请使用APC。它对数据库吞吐量没有影响。

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

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

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