2012-05-03 3 views
9

У меня есть простой пример, когда я устанавливаю значение в течение 5 секунд. Проблема в том, что через 5 секунд; Я все еще возвращаю значение, когда ожидаю «ложь».Memcache + PHP - Почему данные не заканчиваются?

$memcache = new Memcache; 
$memcache->connect('localhost', 11211) or die ("Could not connect"); 


$memcache->set('foo', 'bar', 0, 5); // 5 seconds expiry 
var_dump($memcache->get('foo')); // bar 
sleep(10); 
var_dump($memcache->get('foo')); // still shows bar 

Вот Memcache версия сервера

версия Сервера: 1.4.13

+1

Мне любопытно, так как я тестировал в своей машине, и я вижу bool (false) во втором случае. – g13n

+0

Я вижу «бар» на обоих выходах – shergill

+0

Попробуйте спать 10 секунд, просто чтобы вытащить все возможные перекрытия. –

ответ

1

Как код выглядит нормально - следующая цепь вниз линии, чтобы посмотреть на любой вашей версии PHP кэша памяти расширение не работает, или сам сервер memcached.

Это получается, но сложно. Самый простой - сначала исключить сервер memcached. (Там в PHP интерфейс можно установить, - но это не поможет вам работать outwhich немного.) Так что ...

В терминале (или окно командной строки в Windows) введите

telnet localhost 11211 

(Примечание - телнет клиент не установлен в Windows по умолчанию - перейдите к «панели управления», «включите или отключите функции Windows» и добавьте оттуда.)

Это дает вам доступ к memcached.

Затем введите

stats items 

который перечисляет элементы памяти в Memcached.

Надеюсь, вы получили только одну плиту, поэтому запомните его номер и тип

stats cachedump [Number] 0 

И это будет список того, что записано в кэше.

Если это все еще показывает «бар» (в кодированном формате), то это сервер memcached, который не работает - обновление для более новой версии.

Если это не отображает «бар» (или, желательно, элемент просто не существует), вы вместо этого получаете ERROR), то это будет расширение memcache для PHP, которое не работает. Опять же, проверьте свою версию этого.

Когда это сделано, тип

quit 

Альтернатива, чтобы проверить "Memcached" (расширение PHP) и переписать свой PHP код этих классов. Это новее. Если это все еще не удается, это определенно сервер memcached; если это работает, это расширение php memcache.

+0

Вот что я получаю STATs пунктов STAT пунктов: 1: номер 1 STAT пункты: 1: возраст 15 STAT пункты: 1: выселены 0 STAT пунктов: 1: evicted_nonzero 0 STAT пунктов: 1: evicted_time 0 предметов STAT: 1: OutOfMemory 0 STAT вещи: 1: tailrepairs 0 STAT изделия: 1: восстановленные 0 элементов STAT: 1: expired_unfetched 0 Элементы STAT: 1: evicted_unfetched 0 Значит ли это, что сервер memcache не работает, поскольку элемент все еще находится в кеше? – shergill

+0

Попробуйте последнюю инструкцию выше (статистика cachedump 1 0), и она должна дать вам что-то обратно. – Robbie

4

Поздно в игре, но в коде это выглядит, как вы передаете «0» для истечения срока (не «5»), что означает «никогда не истекает» В частности:

$memcache->set('foo', 'bar', 0, 5); // 5 seconds expiry 

Должно быть :

$memcache->set('foo', 'bar', 5); // 5 seconds expiry 

Если я не буду недопонимание the PHP documentation located here, который показывает, что набор команд принимает три параметра:

public bool Memcached::set (string $key , mixed $value [, int $expiration ]) 

Редактировать: Привет, я вижу, что вы используете расширение Memcache, а не Memcached, which does have four parmaters. Может быть, попробуйте использовать MEMCACHE_COMPRESSED константу вместо 0, чтобы увидеть, если он работает:

$memcache->set('foo', 'bar', MEMCACHE_COMPRESSED, 5); // 5 seconds expiry 
0

Существовал ошибка в Memcached сервере, включая версию 1.4.13, по меньшей мере, 1.4.14, что после того, как Memcached сервер был запущен в течение некоторого времени он иногда попадал в режим, когда он не мог бы правильно истечь значения.

Перезапуск службы исправил его для меня, и я надеюсь, что более новые версии исправят его навсегда.