PHP: apc_store не работает как задумано - PullRequest
8 голосов
/ 26 мая 2010

Я начал пробовать 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 не работает должным образом?

EDIT: Чтобы убедиться, что никто больше не тратит два часа на поиск решения, когда это вызвано ошибкой, вот один: http://pecl.php.net/bugs/bug.php?id=16894&edit=1 (хотя и не самый эффективный)

1 Ответ

8 голосов
/ 26 мая 2010

Кажется, это известная проблема: Ошибка 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 может отключить это поведение при однократной записи. Но я попробовал это кратко, и я не мог подтвердить это работает. Возможно, вам повезет больше (не забудьте перезапустить Apache при изменении php.ini).

...