假设我将数据缓存在PHP数组中的PHP文件中,如下所示:
/cache.php
<?php return (object) array(
'key' => 'value',
);
我像这样包含缓存文件:
<?php
$cache = include 'cache.php';
现在,问题是APC会在内存中自动缓存缓存文件吗?我的意思是作为典型的操作码缓存,就像所有.php文件一样。
如果以不同方式存储数据(例如JSON格式(cache.json)),APC不会自动缓存数据吗?
apc_store
会更快/更好吗?
答案 0 :(得分:10)
不要将APC的缓存功能与优化中间代码和缓存已编译代码的能力相结合。 APC提供两种不同的东西:
让我们看一下(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也能正常工作。对于开发设置很有用,通常不应该使用任何缓存。