![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
infarch |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Здравствуйте.
Пытаюсь запустить и использовать memcached под виндовс 7. Сам сервис запустил: D:\memcached-amd64>memcached.exe -l localhost -p 12345 -v Процесс висит в памяти, могу доступиться через телнет. Теперь пробую использовать:
Однако set не работает, возвращает 0. Я полез в сам Cache::Memcached, дошел до вот этой строки:
На ней все останавливается и в $! я нахожу сообщение "Unknown error". Сам я абсолютно не знаком с использованием сокетов, мне это ни о чем не говорит. Может подскажете в чем может быть проблема? пс. файрволл отключен |
||||
|
|||||
infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
UPD. Запустил memcached с ключом -vv. В момент конекта вижу в консоли:
<644 new auto-negotiating client connection <644 connection closed. Пациент значит не совсем мертв... Но причина по прежнему не понятна. |
|||
|
||||
tzirechnoy |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: нет Всего: 16 |
1) УМВР. Debian/stable, ровно этот код и строка запуска memcached.
2) Попробуйте 127.0.0.1 вместо localhost и/или проверьте, что возвращает Socket::inet_aton($ip) в $sin = Socket::sockaddr_in... 3) $! можно напечатать в числовом контексте (хотя, вообще говоря, в перле такого нет) -- например, printf "%d", $!. Кроме $! есть ещё $^E. Хотя, конечно, WSA такая вещь, что всего можно ждать... 4) Попробуйте поставить timeout в 0. non-blocking sockets можэт иметь ограничения портируемости. |
|||
|
||||
infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Пробовал использовать айпи вместо локалхост, результата нет. Таймаут в ноль тоже не помог. Да и как его поставить... Вот кусок конструктора:
Ставим ноль, получаем дефолт. Ну я его руками подправил, для восприятия нулей. И не помогло. Вывел $sin на печать, получил забавные смайлики: sin=☻ 09⌂ ☺. А вот $^E несколько улучшил читаемость: "A non-blocking socket operation could not be completed immediately". После этого я еще раз пересмотрел код и пришел вот к этому: IO::Handle::blocking($sock, 1). переписал на IO::Handle::blocking($sock, 1) or die $!; и получил "Inappropriate I/O control operation". Что бы это значило?.. |
|||
|
||||
Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
infarch, а могешь поискать как определяются переменные $sock и $sin.
Мож там пафос в криво выставленных флагах. Если найдешь вызов функции socket - тож в студию ! И плюс, ежели вдруг будет вызов функции setsockopt - тоже интересно посмотреть Добавлено через 4 минуты и 49 секунд он у тебя в бинарном виде -------------------- менеджер по кодеврайтингу ![]() |
|||
|
||||
infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Конечно, могу. Вот в сокращенной форме то что происходит:
|
|||
|
||||
tzirechnoy |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: нет Всего: 16 |
ActivePerl 5.16 for win32, memcached 1.4.5 64-бит от northscale: В sub _connect_sock {
заменить
Работать будет видимо только с неблокирующими сокетами (timeout > 0) |
|||
|
||||
infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
tzirechnoy, ваш рецепт сработал! Огромное спасибо!
|
|||
|
||||
Bulat |
|
||||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
здесь вроде бы все кошерно. Посему можешь попробовать совет tzirechnoy Или эту строку подхачить
на
Если не поможет - попробуем ковырятся дальше! -------------------- менеджер по кодеврайтингу ![]() |
||||
|
|||||
tzirechnoy |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: нет Всего: 16 |
Он ужэ сказал -- что это просто неработает. Точнее, неработает конкретно blocking($sock, 1) -- но во-первых blocking($sock, 0) -- не выглядит осмысленным, поскольку ошыбки и так явно идут от неблокирующихся хэгдлов, во-вторых почти наверняка если код для установки blocking неправильный/не от того API -- то и для снятия будет такжэ. Впрочем, мне до сих пор непонятно, как он всё-таки получился non-blocking. Возможно, это поведение по умолчанию в WSA. В-третьих -- это WSA, что вы хотели. Ад, заборы, коровники. Проще всего -- отправить однострочный патч автору и забить. Можно попытаться представить, что IO::Socket::INET более используемый, потому там большэ шансов, что заработает сразу, и потому переписать на IO::Socket::INET -- но как бы видно, что надо переписывать и отлажывать десяток-другой строк -- и непонятно в чём будет выигрыш дажэ если что-то получится. |
|||
|
||||
Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
tzirechnoy, много эмоций, а по сути - практически ничего. Это во-первых.
Во-вторых, функция socket создает блокирующие сокеты по умолчанию, и по-крайней мере это в виндовс всегда работало, а значит от чего там идут ошибки - вовсе не явно. Не заглядывая в код модуля, а читая лишь посты - вообще ничего явного не вижу. В-третьих, то, что не работает вызов blocking($sock, 1), вовсе не означает, что вызов blocking($sock, 0) - тоже не будет работать! Почему - читай дальше. В четвертых, учитывая, что это windows - лично я не знаю, какие константы из fcntl, socket и прочих функций в ней реализованы кошерно, а какие нет. В пятых, и конечных, я могу найти не одно верное решение данной проблемы, когда будет понятно в чем суть, но каждый выбирает сам, какое ему любо. Однако от выбора одного решения из множества, вовсе не означает, что другие способы решения - бесмысленны! В шестых, на этом, я надеюсь флуд будет закончет! -------------------- менеджер по кодеврайтингу ![]() |
|||
|
||||
tzirechnoy |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: нет Всего: 16 |
Верно подмечено. Я не модэратор, но по мне так -- обращайтесь, когда потребуется ещё раз выплеснуть. |
|||
|
||||
infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Друзья, не ссорьтесь ) Проблема решена для меня и это главное. Тут такая ситуация - на девелоперской машине я модуль мемкешед и попатчить могу, не критично. А в продакшене это будет линукс сервер и я думаю там то проблем не будет.
Вот кстати вопрос еще: я в примере к модулю видел что в конструкторе определяется несколько серверов. Что это дает? Можно ли мемкешед инстансы организовать в устойчивый кластер? |
|||
|
||||
tzirechnoy |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: нет Всего: 16 |
Распределение нагрузки. Ключ хэшыруется, и на основании хеша определяется, на какой сервер его отправлять.
memcached и устойчивость -- какое-то странное сочетание. Как минимум -- зачем вам устойчивый кластер из memcached, всё равно жэ его значения периодически выкидываются? |
||||
|
|||||
infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Насколько я понимаю, выкидываются если настроить таймаут, иначе хранятся до последнего. Или не так? Я вообще предполагал там хранить объекты которые часто читаются из базы, но редко изменяются. Еще хранить сесии. Причем сесии будут только там, в базу данных не пойдут. И вот возникает сомнение... Если один сервер упадет или станет недоступен то получается что куча юзеров окажутся разлогинеными. Это мне не нравится.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |