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

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

Как поддерживать простой сервис с отслеживанием состояния в yaws? Как реализовать связь с процессом в исходном файле erl «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.


person Pavel Ajtkulov    schedule 23.10.2011    source источник


Ответы (2)


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

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

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

person PokerFace    schedule 13.09.2012

There only 2 ways to access a process in Erlang: Either you know its Pid (and the node where you expect the process to be) or You know its registered Name (and the erlang node its expected to be).

Lets say you have your appmod:

-module(myappmod).
-export([out/1]).
-include("PATH/TO/YAWS_SERVER/include/yaws_api.hrl").
-include("PATH/TO/YAWS_SERVER/include/yaws.hrl").
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.
check_initial_state(A)-> CookieObject = (A#arg.headers)#headers.cookie, case yaws_api:find_cookie_val("InitialState", CookieObject) of [] -> unkown; Cookie -> {ok,Cookie} end.
extract_request(Arg)->
%% 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.
That simple set up shows you how you would use processes to keep things about a user. However, the use of processes is not good. Processes do fail, so you need a way of recovering what data they were holding.

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

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

person Muzaaya Joshua    schedule 23.10.2011