8

我已经开始尝试 APC 在每个网络服务器上存储一些特定的数据,作为对 memcached 的补充。

但是,下面的代码片段让我很头疼:

echo apc_store('key', 'value');
echo apc_store('key', 'newvalue');
echo apc_fetch('key'); 

// Echoes: value

内存缓存示例:

$memcached = new Memcached;

$memcached->addServer('localhost', '11211');

$memcached->set('key', 'value1');
echo $memcached->get('key') . '<br />'; // Echoes value1

$memcached->set('key', 'value2');
echo $memcached->get('key'). '<br />'; // Echoes value2

$memcached->set('key', 'value3');
echo $memcached->get('key'). '<br />'; // Echoes value3

为什么 apc_store 不能正常工作?

编辑: 为了确保没有其他人花费两个小时寻找解决方案,当这是由错误引起时,这里是一个:http ://pecl.php.net/bugs/bug.php?id=16894&edit= 1(虽然不是最有效的)

4

1 回答 1

8

这似乎是一个已知问题:PECL 错误 #16814 新警告“避免了潜在的缓存冲击”

似乎apc_store()每个请求只允许一个。我试过这个测试:

<?php

echo "<p>apc_fetch(key): " . apc_fetch('key') . "</p>\n";
// echo "<p>apc_store(value): " . apc_store('key', 'value') . "</p>\n";
echo "<p>apc_store(newvalue): " . apc_store('key', 'newvalue') . "</p>\n";
echo "<p>apc_fetch(key): " . apc_fetch('key') . "</p>\n";

玩这个,取消注释第二行,看看它确实覆盖了前一个请求上的密钥集,但是每个请求只能存储一次给定的密钥。

错误日志提到了一个 ini 文件设置apc.slam_defense,该设置在设置为时Off可能会禁用此单写行为。但我简单地尝试了一下,我无法确认这是否有效。也许你会有更多的运气(记得在更改 php.ini 时重新启动 Apache)。

于 2010-05-26T19:42:58.533 回答