Я начал пробовать 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') . '
'; // Echoes value1
$memcached->set('key', 'value2');
echo $memcached->get('key'). '
'; // Echoes value2
$memcached->set('key', 'value3');
echo $memcached->get('key'). '
'; // Echoes value3
Почему apc_store не работает как правильно?
Править: Чтобы удостовериться, что никто больше не проводит два часа на поиск решения, когда это вызывается ошибкой, вот, тот: http://pecl.php.net/bugs/bug.php?id=16894&edit=1 (не самое эффективное, хотя)
Кажется, это известная проблема: Ошибка 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
, который при установке на Выкл.
может отключить эту функцию однократной записи. Но я попробовал это ненадолго и не смог подтвердить, что это работает. Возможно, вам повезет больше (не забудьте перезапустить Apache при изменении php.ini).