Как сохранить состояние в зевках - PullRequest
0 голосов
/ 23 октября 2011

У меня есть некоторый процесс (порожденный) с состоянием.

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

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

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 ]

2 голосов
/ 13 сентября 2012

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

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

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

0 голосов
/ 23 октября 2011

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

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

-module(myappmod).
-export([out/1]).
-include("PATH/TO/YAWS_SERVER/include/yaws_api.hrl").
-include("PATH/TO/YAWS_SERVER/include/yaws.hrl").<br>
out(Arg) ->
   case check_initial_state(Arg) of
       unknown -> create_initial_state();
       {ok,Value}-> 
              UserPid = list_to_pid(Value),
              UserPid ! extract_request(Arg),
              receive
                Response -> {html,format_response(Response)}
              after ?TIMEOUT -> {html,"request_timedout"}
              end
   end.<br>
check_initial_state(A)->
   CookieObject = (A#arg.headers)#headers.cookie, 
   case yaws_api:find_cookie_val("InitialState", CookieObject) of
        [] -> unkown;
        Cookie -> {ok,Cookie}
   end.<br>
extract_request(Arg)-><br> %% get request from POST Data or Get Data
 Post__data_proplist = yaws_api:parse_post(Arg),
 Get_data_proplist = yaws_api:parse_query(Arg),
 %% do many other things....
 Request = remove_request(Post__data_proplist,Get_data_proplist),
 Request.
Эта простая настройка показывает вам, как вы будете использовать процессы, чтобы хранить информацию о пользователе.Однако использование процессов не является хорошим.Процессы терпят неудачу, поэтому вам нужен способ восстановления данных, которые они хранили.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...