2011-10-23 35 views
0

我有一些過程(產生)與狀態。如何在雅司中保持有狀態

如何在雅司面保持簡單的有狀態服務? 如何實現通信來處理「appmods」erl源文件?

更新: 讓我們我們有簡單的過程

start() -> loop(0). 

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

什麼是最簡單的(簡單:沒有gen_server,亞普)的方式從網絡訪問過程?

也許,我需要一個gen_server + yapp + yaws/appmods + yaws的最小示例。

回答

0

只有兩種方法可以訪問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").
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.
這個簡單的設置向你展示了你將如何使用進程來保持用戶的信息。但是,使用流程並不好。進程確實失敗了,所以你需要一種恢復他們所持有的數據的方法。

更好的方法是擁有關於用戶的數據存儲並使用一個gen_server來執行查找。你可以使用Mnesia。我不建議你使用Web上的進程來保持用戶狀態,不管你在做什麼類型的應用程序,即使它是一個消息應用程序。 Mnesia或ETS表可以保持狀態,所有你需要做的就是查找。

使用更好的存儲機制來保持進程以外的狀態。流程是一個失敗點。其他人使用Cookies(和/或會話cookie),其價值以某種方式用於從數據庫中查找某些內容。但是,如果您堅持需要流程,那麼您就有辦法記住他們的Pids或註冊名稱。您可以將用戶Pid存儲到其會話cookie e.t.c中。

2

#arg結構是雅司程序員非常重要的數據結構。 在Yaws out/1的ARG中,有一個可以保存用戶狀態的變量。

「的狀態,國家%%用於由輸出/ 1回調的用戶」

你可以得到詳細的信息here