6

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

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

//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 是否对这些托管服务提供商不利?

4

3 回答 3

3

APC 是一个操作码缓存:

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

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

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

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

缓存会话

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

缓存渲染的模板

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

这些都不使用APC

于 2012-04-02T13:49:08.647 回答
2

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

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

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

字节码不像生成的HTML。它与普通的 PHP 脚本是同一个程序。即使启用了 APC,PHP 也必须处理数据并呈现 HTML。

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

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

过早的优化是万恶之源。
仅在有理由时才开始优化您的网站。

为什么 Web Hosters 等待安装 APC?

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

于 2012-04-02T14:00:04.103 回答
1

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

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

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

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

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

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

于 2012-04-02T13:48:16.293 回答