Эмулятор php_memcached на PHP

Как неоднократно здесь писалось, новое расширение php_memcached лучше старого php_memcache практически всем, за исключением одного — нет Windows-версии. Что сильно напрягает при разработке и отладке.

Так как не было желания ставить себе Visual C и разбираться, как компилировать это расширение, я написал обёртку на PHP.

Просмотреть исходный код можно здесь (43 K), а скачать в архиве здесь (8 K)

В эмуляторе полностью воспроизведён интерфейс Memcached-класса, а работа по возможности приближена к работе реального расширения.

Так же в комментариях исходника переведена документация к методам, константам опций и результатов и даны свои комментарии. Так что код можно использовать просто вместо русскоязычной документации.

Эмулятор, конечно, далёк по оптимальности до настоящего расширения и при большом количестве параллельных запросов в некоторых местах может работать некорректно. Однако, для единоличной разработки под Windows вполне подходит.

Работает эмулятор через старое расширение php_memcache, поэтому оно должно быть установлено.

Базовые методы add, set, replace, get, delete и др.

Список аргументов базовых функций приведены к новому интерфейсу (у старого расширения он был другим).

Поддерживаются префиксы ключей, устанавливаемые через setOption(Memcached::OPT_PREFIX_KEY, $prefix).

Убраны некоторые различия в поведении расширений (например, при отрицательном инкременте)

Для get() поддерживатеся callback-аргумент $cache_cb.

Поддерживается получение результатов через getResultCode (RES_NOTFOUND и RES_NOTSTORED).

В свете некоторой путаницы с преобразованием типов результаты при false и null могут отличаться.

Эмулируются append и prepend.

Мультизапросы

Поддерживаются getMulti и setMulti.

Надеюсь вы понимаете, что они эмулируются через банальный цикл и на локалке повышения производительности от них ждать не нужно.

getDelayed, fetch, fetchAll

Внешне эмулируют тоже поведение, что и реальное расширение.

Пул серверов, persistent_id

$persistent_id в конструкторе позволяет связывать одно подключение с несколькими объектами.

Реализованы addServer, addServers, getServerList.

А вот getStats выдаёт пустой список.

*byKey

getByKey() возвращает первый сервера, а все *byKey()-функции идентичны основным.

setByKey($server_key, $key, $value, $expiration) аналогична set($key, $value, $expiration) и так далее.

CAS-токены

CAS-токены не поддерживаются. Всегда возвращаются нули, а cas() работает аналогично set().

getResultCode()

Описаны все RES-константы с правильными значениям. Основные функции устанавливают результат в RES_SUCCESS, RES_SUCCESS, RES_NOTFOUND, RES_END.

setOption

Описаны все OPT-константы с правильными значениями. Все опции изначально установлены в стандартные значения по умолчанию.
Можно устанавливать через setOption и получать из getOption. Но реально на работу влияют только две:

OPT_PREFIX_KEY устанавливает префикс ключей.

OPT_COMPRESSION — при включённом сжатии не работают append() и prepend().

flush

flush() не поддерживает время сброса.

6 комментариев »

  • Отлично. Наконец дебажить на локалхосте можно ;-)

    rusk, 18.10.2009, 3:31

  • public function setByKey($server_key, $key, $value, $expiration = 0) {
    return $this->setByKey($key, $value, $expiration);
    }

    Бага?

    Vitaliy Khamin, 4.02.2010, 9:28

  • Бага. Спасибо.

    vasa_c, 4.02.2010, 22:32

  • Здравствуйте! Вижу статья очень старая, но мне даже через 5 лет она помогла! Я просто подключил этот файлик в скрипте инициализации и вуала, мне под виндой доступен memcacheD! Правда я еще не до конца уверен в правильности работы, время покажет, но все равно спасибО!

    Николай, 27.02.2014, 12:09

  • Блин, не все так радужно, а где метод touch()? Мне вот такую ошибку возвращает: Call to undefined method Memcached::touch() in C:\wnmp-server\www\develop.my\_lib\SessionHandlerMemcache.class.php on line 53. И метод Memcached::touchByKey() тоже отсутствует. Ладно, проехали, хватит венду мучить, ставлю виртуальный LNMP-сервер на православный debian, куда нить в VirtualBox.

    Николай, 27.02.2014, 13:10

  • touch() позже уже добавили.

    >Ладно, проехали, хватит венду мучить, ставлю виртуальный LNMP-сервер на православный debian, куда нить в VirtualBox.
    Правильно!

    vasa_c, 27.02.2014, 14:18

Leave a comment