Я хочу.
Кетам в PHP, да еще так, чтобы был доступ хоть откуда-то.
Я не говорю о PHP. Я имею в виду доступ.
Ну и из PHP тоже.
Хорошо, давайте начнем.
Что мы имеем.
Интернет, Гугл.
… Все :( Аааа, чуть не забыл.
Самое важное.
Потолок, чтобы было куда тупо смотреть.
Итак, давайте Google. В PHP нет кетама.
Где это?
Ого, на Last.fm.
Но после 10 апреля 2007 года версию 0.1.1 никто не обновлял, да и набор функционала несколько скудный.
На Данге.
com уже завален всякой ерундой.
Возможно, это возможно, но разобраться в этом немного хлопотно.
Давайте погуглим дальше.
Что мы имеем.
Функции Memcached для MySQL
libmemcached 0.23 УХ ТЫ!!!!
Клиенты, использующие библиотеку:
Рубин:
"> github.com/fauna/memcached/tree/master
Перл:
"> code.google.com/p/perl-libmemcached
Питон:
"> code.google.com/p/python-libmemcached
PHP: (на японском языке)
"> labs.gree.jp/Top/OpenSource/libmemcached.html
Давайте отправимся туда, где есть PHP. СТОРОЖИТЬ!!! Шалашики.
Блин и версия 0.1.0. Но она свежая, от 18 сентября 2008 года.
Короче говоря, глюки в ней до сих пор не исправлены, потому что ни у кого не было времени их искать.
… Все.
Больше ничего нет. Ну давай попробуем.
Наверное, лучше не начинать с хижин.
Хотя весь мой буржуазный словарь такой: привет, да, нет, проблема, спасибо и все.
.
ну не всё конечно, там тоже херня, но мне это не поможет. В японском оно короче.
Я устанавливаю libmemcached и функции Memcached для MySQL на сервер базы данных.
На веб-сервер libmemcached. Воспитание четырех демонов memcached. Один на веб-сервере, три на сервере базы данных.
Почему? И кто знает, случилось ли это именно так.
Я устанавливаю функции.
Хм, список впечатляет
memc_add
memc_add_by_key
memc_servers_set
memc_server_count
memc_set
memc_set_by_key
memc_cas
memc_cas_by_key
memc_get
memc_get_by_key
memc_delete
memc_delete_by_key
memc_append
memc_append_by_key
memc_prepend
memc_prepend_by_key
memc_increment
memc_decrement
memc_replace
memc_replace_by_key
memc_servers_behavior_set
memc_udf_version
memc_list_behaviors
memc_stats
memc_stat_get_keys
memc_stat_get_value
Не понял.
Если есть Кас? Откуда оно берется? Почему я сдала Кас без гетов!!! Хорошо, мы напомним им об этом.
Может быть.
Определение серверов SELECT memc_servers_set(‘192.168.0.10:11211, 192.168.0.11:11211, 192.168.0.11:11212, 192.168.0.11:11213);
Засовываем десять ключей в тайник SELECT memc_set(‘key1’, ‘val1’);
…
SELECT memc_set(‘key10’, ‘val10’);
Берем их из тайника SELECT memc_get(‘key1’);
…
SELECT memc_get(‘key10’);
Вроде нормально, возвращает то, что вложил.
Теперь валим одного демона memcached. Как и следовало ожидать, были прикрыты две клавиши.
Мы снова кэшируем 10 одинаковых ключей.
Черт возьми.
Те же самые два пропавших без вести человека так и не появились.
Кетамой даже не пахнет. Ну да ладно, я не против прочитать ридми.
Я не нашел ничего умного в функциях Memcached для MySQL. Пойдем
.
Блин, как все запутано.
Да, это то, на что это похоже
"> docs.tangent.org/libmemcached/memcached_behavior.html
По мнению переводчика, поведение такое.
По умолчанию MEMCACHED_BEHAVIOR_DISTRIBUTION — это MEMCACHED_DISTRIBUTION_MODULA, но нам нужны MEMCACHED_DISTRIBUTION_CONSISTENT и MEMCACHED_BEHAVIOR_HASH, чтобы был MEMCACHED_HASH_KETAMA. И memcached_behavior_set() делает это.
В MySQL для этого параметра должно быть установлено значение memc_servers_behavior_set. Брр, стоп.
Что это такое в документе memcached_behavior.pod? = элемент MEMCACHED_BEHAVIOR_DISTRIBUTION Используя это, вы можете включить различные способы распространения значений на серверы.
Метод по умолчанию — MEMCACHED_DISTRIBUTION_MODULA. Вы можете включить согласованное хеширование, установив MEMCACHED_DISTRIBUTION_CONSISTENT. Последовательное хеширование обеспечивает лучшее распределение и позволяет серверам добавлен в кластер с минимальными потерями кэша.
В настоящее время MEMCACHED_DISTRIBUTION_CONSISTENT — это псевдоним значения.
MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA. = элемент MEMCACHED_BEHAVIOR_KETAMA Устанавливает дистрибутив по умолчанию MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA. и хэш MEMCACHED_HASH_MD5. Что-то в моей голове начинает идти не так.
Да, я наверное понял, нужно сделать MEMCACHED_BEHAVIOR_KETAMA. Так? Продолжим чтение.
Кажется глупым нуждаться во всем.
Лучше было бы понять это по-буржуазному.
Похоже, это оно Для простых опций включения или выключения вам просто нужно передать значение 1. Итак, вам нужен набор MEMCACHED_BEHAVIOR_KETAMA 1. Ну давай попробуем.
SELECT memc_servers_behavior_set (‘MEMCACHED_BEHAVIOR_KETAMA’, 1);
Хм.
Кирдык полон.
mysql>SELECT memc_servers_behavior_set('MEMCACHED_BEHAVIOR_KETAMA', 1);
ERROR 2013 (HY000): Lost connection to MySQL server during query
mysql>
Единственное лекарство - перезапустить сервер MySQL.
ХОРОШО.
Напишем разработчикам
"> forums.mysql.com/read.php?150
,231325,231325#msg-231325 Быстро.
отписался
"> forums.mysql.com/read.php?150
,231325,231359#msg-231359 И если так
"> forums.mysql.com/read.php?150
,231325,231442#msg-231442 То же самое.
Кажется, это долго.
Вам придется тупо смотреть в потолок.
Может быть, там что-то есть? Точно.
Есть.
Только некоторые мысли не умные, а грязные.
Если то, что мне нужно, приходит откуда-то, это не то, что мне нужно.
Значит, они положили его куда-то.
Мне просто нужно найти его где-нибудь и положить туда то, что мне нужно.
Вот черт. Зайдите в источники.
И они здесь.
И я знаю только название C. Я имею в виду, что именно так называется язык.
В любом случае.
Делать нечего, будем искать знакомые слова.
Библиотека MySQL, наверное, не стоит, это просто блокнот. Давайте перейдем к самой libmemcached. Да, вот оно.
В memcached.c. строка 29 ptr-> распределение= MEMCACHED_DISTRIBUTION_MODULA; целых два знакомых слова.
Да и название конструкции многообещающее: memcached_st *memcached_create(memcached_st *ptr).
Теперь попробуем понять, кто такой memcached_st. Наверное, понятно.
По словам libmemcached.pod, если на Translate.ru мне все правильно объяснили, то это то самое место, где находится не то.
Давайте снова
.
Конференции там нет, но есть почтовый червь
"> lists.tangent.org/mailman/listinfo/libmemcached
.
Там не так уж и много.
Давайте найдём знакомые слова.
Есть что-то.
"> lists.tangent.org/pipermail/libmemcached/2008-September/000434.html
Если я правильно понимаю, вам нужно в какой-то степени установить MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT. Говорят 10, попробую 3.
"> lists.tangent.org/pipermail/libmemcached/2008-August/000429.html
Что ж, мы сделаем то же самое.
Так.
Попробуем поправить источники.
В смысле поставить то, что нужно.
Вместо ptr-> distribution= MEMCACHED_DISTRIBUTION_MODULA; Напишем ptr-> distribution= MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA; Ух ты.
Мои первые 0,5 строчки на C в жизни.
Вместо ptr-> retry_timeout= 0; Напишем ptr-> retry_timeout= 60; Ураааа.
Зачем вместо этого писать о MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT? Мы снова тупо смотрим в потолок.
Зачем это смотреть? Найдите SERVER_FAILURE_LIMIT в источниках.
Есть.
В memcached_behavior.c. Страница 166, называется ptr-> server_failure_limit. Добавим по аналогии с остальными ptr-> server_failure_limit= 3; Возможно, придется прокатиться.
По сути, если что-нибудь случится, сервер умрет. Поэтому мы поставим его таким же образом.
Это то, что произошло memcached_st *memcached_create(memcached_st *ptr)
Все.
{
memcached_result_st *result_ptr;
if (ptr == NULL)
{
ptr= (memcached_st *)malloc(sizeof(memcached_st));
if (!ptr)
return NULL; /* MEMCACHED_MEMORY_ALLOCATION_FAILURE */
memset(ptr, 0, sizeof(memcached_st));
ptr->is_allocated= MEMCACHED_ALLOCATED;
}
else
{
memset(ptr, 0, sizeof(memcached_st));
}
result_ptr= memcached_result_create(ptr, &ptr->result);
WATCHPOINT_ASSERT(result_ptr);
ptr->poll_timeout= MEMCACHED_DEFAULT_TIMEOUT;
ptr->connect_timeout= MEMCACHED_DEFAULT_TIMEOUT;
ptr->retry_timeout= 60;
ptr->distribution= MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA;
ptr->server_failure_limit= 3;
return ptr;
}
Давайте перекомпилируем библиотеку и двинемся дальше.
Перейдем к онани.
ну, вы поняли, итерации.
Определение серверов SELECT memc_servers_set(‘192.168.0.10:11211, 192.168.0.11:11211, 192.168.0.11:11212, 192.168.0.11:11213);
Засовываем десять ключей в тайник SELECT memc_set(‘key1’, ‘val1’);
…
SELECT memc_set(‘key10’, ‘val10’);
Берем их из тайника SELECT memc_get(‘key1’);
…
SELECT memc_get(‘key10’);
Вроде нормально, возвращает то, что вложил.
Валим одного memcached-демона.
Не понял.
Какого черта.
Почему они ВСЕ живы? Я говорю о данных, которые я закешировал.
ХОРОШО.
Давайте снесем второй.
Ну, мы с этим не согласились.
Они ВСЕ живы.
Ну а что насчет третьего? Блин, все живы.
Ну, так легко нас не возьмешь.
Метода против лома не существует. Валим последнего четвертого демона memcached. То же самое.
Выживших не было.
Мы начинаем убивать, выращивать, хранить, извлекать из.
.
короче, занимайтесь итерациями.
Я НЕ МОГУ УБИТЬ!!! Хм.
Работает. Даже больше.
О, нет. Вы не возьмете нас так легко.
УБИЛИ ВСЕ!!! Я оставил один узел живым.
Я спокойно взял второй.
Не делая никаких вызовов memcached, я сбросил первый.
Всё, я не выжил.
Знайте наш народ, кого хотите, мы вас раком поставим.
Фу.
О чем я говорю?
Собственно о PHP.
Ну что, пойдём по хатам
"> labs.gree.jp/Top/OpenSource/libmemcached.html
Так что слава богу хоть исходников в хате нет
"> github.com/kajidai/php-libmemcached/tree/master
Привинтите его.
"> labs.gree.jp/Top/OpenSource/libmemcached/Document.html
Давай попробуем
<Эphp
$memcached = new Memcached();
$memcached->addserver('192.168.0.10', 11211);
$memcached->addserver('192.168.0.11', 11211);
$memcached->addserver('192.168.0.11', 11212);
$memcached->addserver('192.168.0.11', 11213);
$memcached->set('key1', 'val1');
$ret = $memcached->get('key1');
Echo $ret. “<br>”;
…
Этот ублюдок работает.
Работает с MySQL.
Данные обрабатываются корректно в парах.
Падаем, поднимаем, пишем, читаем – все правильно.
Кстати.
На веб-сервере я испортил файл libmemcached.
Какой функционал у нас здесь есть?
Неплохо
memcached_ctor
memcached_server_add
memcached_add
memcached_add_by_key
memcached_append
memcached_append_by_key
memcached_behavior_get
memcached_behavior_set
memcached_cas
memcached_cas_by_key
memcached_delete
memcached_delete_by_key
memcached_get
memcached_get_by_key
memcached_set
memcached_set_by_key
memcached_increment
memcached_decrement
memcached_prepend
memcached_prepend_by_key
memcached_replace
memcached_replace_by_key
memcached_server_list
memcached_mget
memcached_fetch
memcached_server_list_append
memcached_server_push
получает также отсутствует.
А что насчет глюков.
Черт его знает. Я бы хотела узнать.
Ну вообще-то мне не стоит писать автору на моем русском английском в Японию.
Он ответит мне на своем японском английском.
И вот начнется война.
Хорошо, давайте обратимся к источникам.
За свою жизнь я уже написал на C 2,5 строки.
Блин, это так просто.
Ааа, я въехал.
Он только что написал обертку для трансляции звонков с помощью Zend. Блин, здесь наверное негде заморачиваться.
Хорошо.
Подведем итоги.
Во-первых.
Я написал свои первые 2,5 строки на C. Во-вторых.
Теперь у меня есть кетам в PHP. Третий.
Черт побери этот тайник, ты так легко его сбросишь.
В-четвертых.
Мне наплевать, нормальный доступ к данным в memcached, хоть из C, хоть из Perl, хоть из PHP и MySQL. Один закладывает, мне все равно, откуда оно и кто еще его правильно читает. ПС.
Снимаю шляпу перед Брайаном Акером
Теги: #memcached #php #ketama #MySQL #Chulan
-
Минусы Создания Собственных Видео На Youtube
19 Dec, 24 -
Интернет Вещей И 5G
19 Dec, 24 -
Отражён Браузерозависимый Xss На Mts.ru
19 Dec, 24 -
Ядро Linux Превышает 10 Миллионов Строк
19 Dec, 24 -
…
19 Dec, 24 -
Как Мы Попали На Android Market
19 Dec, 24