Почему расширение php memcache (или memcached) так ненадежно? - PullRequest
0 голосов
/ 29 ноября 2010

Я разочарован в memcached.Работать с ним было далеко не просто.

Пример:

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

$memcache->set('id', $array, 120);

Я установил это около часа назад - и он все еще здесь!В руководстве сказано, что в качестве параметра можно использовать «количество секунд, начиная с текущего времени».Так почему же срок действия игнорируется?

Еще одна вещь, которая меня беспокоит, это то, что иногда значения не записываются.Все это в значительной степени случайно.«argyleblanket» упоминал, что сталкивался с этими проблемами в руководстве по php: http://www.php.net/manual/en/memcache.set.php#84032 Я также применил этот резерв для всех моих вызовов replace ().Я не понимаю, почему это не сработает при первом звонке.Зачем предлагать функцию replace (), если она в звездочках, если она заменяет контент или нет?

Вопрос в том, почему я доверяю такому программному обеспечению, что оно делает что-то важное, и есть ли способ сделать его болеенадежно?

Ответы [ 2 ]

7 голосов
/ 29 ноября 2010

Вы используете неправильный синтаксис.Третий параметр - это флаг сжатия.

Создайте простой интерфейс, подобный следующему.Это может помочь вам:

/* defines params */
define('MEMCACHED',     1);
define('CACHE_DEFAULT_EXPIRE',  3600);

if(MEMCACHED) if(! class_exists('memcached')) die('memcache not loaded');

/* Cache */
if(MEMCACHED) { 
    global $memcache;
    $memcache = new Memcache();
    $memcache->connect('127.0.0.1', 11211);
}

function cacheSet($key, $var, $expire=NULL) {
    if(!MEMCACHED) return 0;
    global $memcache;
    if(!$expire) $expire = CACHE_DEFAULT_EXPIRE;
    $key = md5($key);
    return $memcache->set($key, $var, false, $expire);
}

function cacheGet($key) {
    if(!MEMCACHED) return 0;
    global $memcache;
    $key = md5($key);
    return $memcache->get($key);
}
5 голосов
/ 29 ноября 2010

Третий параметр - Memcache::set - $ flag , а не $ expire . $ expire является четвертым:

$memcache = new Memcache;
// add server, etc.
$memcache->set('foo', 'bar', 0, 5); // 5 seconds expiry
var_dump($memcache->get('foo')); // bar
sleep(6);
var_dump($memcache->get('foo')); // false

Используемый синтаксис для класса Memcached, а не Memcache.

Что касается вашей проблемы с установкой / заменой, я не могу воспроизвести это ни с Memcache, ни с Memcached на PHP 5.3.3.

Также, на мой взгляд, вы должны пойти на расширение PECL memcached . Он предоставляет больше функций и использует libmemcached напрямую, поэтому он также должен быть более эффективным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...