3

假设我在 PHP 数组中的 PHP 文件中缓存数据,如下所示:

/cache.php

<?php return (object) array(
    'key' => 'value',
);

我包括这样的缓存文件:

<?php
$cache = include 'cache.php';

现在,问题是缓存文件会被APC自动缓存在内存中吗?我的意思是作为典型的操作码缓存,就像所有 .php 文件一样。

如果我以不同的方式存储数据,例如以 JSON 格式 (cache.json),APC 不会自动缓存数据?

apc_store更快/更可取吗?

4

3 回答 3

10

不要将 APC 的缓存能力与其优化中间代码和缓存编译代码的能力混为一谈。APC 提供 2 个不同的东西:

  1. 它提供了一种缓存数据结构(对象、数组等)的便捷方法,以便您可以使用 apc_store 和 apc_fetch 存储/获取它们
  2. 它保留脚本的编译版本,以便下次运行时运行得更快

让我们看一个(1)的例子:假设你有一个需要 1 秒计算的数据结构:

function calculate_array() {
    sleep(1);
    return array('foo' => 'bar');
}
$data = calculate_array();

您可以存储它的输出,这样您就不必再次调用慢速 calculate_array() :

function calculate_array() {
    sleep(1);
    return array('foo' => 'bar');
}
if (!apc_exists('key1')) {
    $data = calculate_array();
    apc_store('key1', $data);
} else {
    $data = apc_fetch('key1');
}

这将大大加快,远少于原来的 1 秒。

现在,对于上面的 (2):拥有 APC 不会使您的程序运行速度超过 1 秒,这是 calculate_array() 需要的时间。但是,如果您的文件还需要(比如说)100 毫秒来初始化和执行,那么只需启用 APC 就需要(大约)20 毫秒。因此,初始化/准备时间增加了 80%。这可以在生产系统中产生相当大的差异,因此即使您从未显式调用它的任何函数,简单地安装 APC 也会对脚本的性能产生明显的积极影响

于 2013-01-11T20:08:00.610 回答
2

如果您只是存储静态数据(如您的示例中),则最好使用apc_store.

这背后的原因不是操作码缓存是更快还是更慢,而是您用于include将静态数据获取到范围内的事实。

即使使用操作码缓存,每次执行时仍会检查文件的一致性。PHP 不必解析内容,但必须检查文件是否存在,以及自操作码缓存创建以来它是否未更改。文件系统检查是资源昂贵的,即使它只是stat一个文件。

因此,我将使用两种方法apc_store来完全删除文件系统检查。

于 2013-01-11T20:23:04.050 回答
1

与其他答案不同,我将使用数组文件解决方案(第一个)

<?php return (object) array(
    'key' => 'value',
);

原因是,对于这两种解决方案,您都在正确的一边,但是当您让缓存到 APC 本身时,您不必处理apc_*()-functions。您只需包含并使用它。当你设置

apc.stat = 0

你也避免了stat每个包含的 -calls。这对生产很有用,但请记住在每次部署时清除系统缓存。

http://php.net/apc.configuration.php#ini.apc.stat

哦,不要忘记:使用文件方法,即使没有 APC,它也可以工作。对于通常不应该使用任何缓存的开发设置很有用。

于 2013-01-11T20:29:46.400 回答