Как неоднократно здесь писалось, новое расширение 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 могут отличаться.
Мультизапросы
Поддерживаются 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()
не поддерживает время сброса.
Отлично. Наконец дебажить на локалхосте можно ;-)
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