Как сохранить состояние в зевках

У меня есть какой-то процесс (порожденный) с государством.

Как поддерживать простой сервис с отслеживанием состояния в челюстях? Как реализовать связь для обработки в исходном файле "appmods"?

обновление: давайте у нас будет простой процесс

start() -> loop(0).

loop(C) ->
  receive 
    {inc} -> loop(C + 1);
    {get, FromPid} -> FromPid ! C, loop(C)
  end.

Какой самый простой (тривиальный: без gen_server, yapp) способ доступа к процессу из Интернета?

Может быть, мне нужен минимальный пример с gen_server+yapp+yaws / appmods+yaws.

2 ответа

Структура #arg является очень важной структурой данных для программиста yaws. В ARG of Yaws out/1 есть переменная, которая может сохранять пользовательское состояние.

msgstr "состояние, %% State для использования пользователями обратного вызова out / 1"

Вы можете получить подробную информацию здесь.

Есть только 2 способа получить доступ к процессу в Erlang: либо вы знаете его Pid (и узел, где вы ожидаете, что процесс будет), либо вы знаете его зарегистрированное имя (и ожидаемый его узел erlang).

Допустим, у вас есть ваш appmod:

модуль (myappmod).
-export([выход /1]).
-include("путь / к /YAWS_SERVER/ включать /yaws_api.hrl").
-include("путь / к /YAWS_SERVER/ включать /yaws.hrl"). 
Out(Arg) -> case check_initial_state(Arg) из неизвестно -> create_initial_state(); {ОК,Value}-> UserPid = list_to_pid(Value), UserPid! extract_request(Arg), Получать Ответ -> {html,format_response(Ответ)} после?TIMEOUT -> {html,"request_timedout"} конец конец.
check_initial_state (А)-> CookieObject = (A#arg.headers)#headers.cookie, case yaws_api:find_cookie_val("InitialState", CookieObject) из [] -> неизвестно; Cookie -> {хорошо,Cookie} конец.
extract_request (Arg) ->
%% получить запрос из данных POST или получить данные Post__data_proplist = yaws_api:parse_post(Arg), Get_data_proplist = yaws_api:parse_query(Arg), %% делают много других вещей.... Request = remove_request(Post__data_proplist,Get_data_proplist), Запрос.
Эта простая настройка показывает вам, как вы будете использовать процессы, чтобы хранить информацию о пользователе. Однако использование процессов не является хорошим. Процессы терпят неудачу, поэтому вам нужен способ восстановления данных, которые они хранили.

Лучше всего иметь хранилище данных о ваших пользователях и один gen_server для поиска. Вы могли бы использовать Mnesia, Я не советую вам использовать процессы в Интернете, чтобы сохранять состояние пользователя, независимо от того, какое приложение вы делаете, даже если это приложение для обмена сообщениями. Мнезия или ETS таблицы могут сохранять состояние, и все, что вам нужно сделать, это посмотреть вверх.

Используйте лучший механизм хранения, чтобы сохранить состояние, отличное от процессов. Процессы - это точка отказа. Другие используют куки-файлы (и / или сессионные куки-файлы), значение которых каким-то образом используется для поиска чего-либо из базы данных. Однако, если вы настаиваете на том, что вам нужны процессы, вы можете запомнить их PID или зарегистрированные имена. Вы можете сохранить пользовательский Pid в сессионном cookie и т. Д.

Другие вопросы по тегам