我有一些状态的进程(产生)。
如何在雅司病中保持简单的有状态服务? 如何在“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。
答案 0 :(得分:2)
#arg结构是雅司程序员非常重要的数据结构。 在ARAW of Yaws out / 1中,有一个可以保存用户状态的变量。
“状态,%%状态供out / 1回调的用户使用”
您可以获取详细信息here。
答案 1 :(得分: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
表可以保持状态,您需要做的就是查找。
使用更好的存储机制来保持除进程之外的状态。流程是一个失败点。其他人使用Cookie(和/或会话cookie),其价值以某种方式用于从数据库中查找某些内容。但是,如果您坚持要求进程,那么,有办法记住他们的Pids或注册名称。您可以将用户Pid存储到其会话cookie e.t.c中。