如何在雅司病中保持状态

时间:2011-10-23 06:50:59

标签: erlang yaws erlangweb

我有一些状态的进程(产生)。

如何在雅司病中保持简单的有状态服务? 如何在“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 个答案:

答案 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中。