我已经开始尝试将APC存储在每个网络服务器上作为memcached的补充。
然而,以下代码片令我头疼:
echo apc_store('key', 'value');
echo apc_store('key', 'newvalue');
echo apc_fetch('key');
// Echoes: value
Memcached示例:
$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(不是最有效的)
答案 0 :(得分:8)
这似乎是一个众所周知的问题:PECL Bug #16814 New warning "Potential cache slam averted for key"
每个请求似乎只允许一个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)。