使用APC进行PHP缓存

时间:2013-01-11 19:57:41

标签: php caching apc

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

/cache.php

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

我像这样包含缓存文件:

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

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

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

apc_store会更快/更好吗?

3 个答案:

答案 0 :(得分:10)

不要将APC的缓存功能与优化中间代码和缓存已编译代码的能力相结合。 APC提供两种不同的东西:

  1. 它提供了一种缓存数据结构(对象, 数组等),以便您可以使用apc_store存储/获取它们 apc_fetch
  2. 它保留了脚本的编译版本,以便 下次他们跑,他们跑得更快
  3. 让我们看一下(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秒快得多,远远低于原来的1秒。

    现在,对于上面的(2):让APC运行不会超过1秒,这是calculate_array()需要的时间。但是,如果您的文件另外需要(比方说)100毫秒来初始化和执行,那么只需启用APC就可以使其需要(大约)20毫秒。因此初始化/准备时间增加了80%。这可以在生产系统中产生很大的不同,因此简单地安装APC会对脚本的性能产生明显的积极影响,即使您从未明确调用其任何功能

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:1)

与其他答案不同,我会使用array-file-solution(第一个)

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

原因是,两种解决方案都在右侧,但是当您将缓存升级到APC本身时,您不必使用apc_*() - 函数。您只需包含并使用它。当你设置

apc.stat = 0

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

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

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