只有兩種方法可以訪問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中。