繁体   English   中英

如何在雅司病中保持状态

[英]How to maintain stateful in yaws

我有一些与州有关的过程(产生)。

如何在雅司病中保持简单的有状态服务? 如何在“appmods”erl源文件中实现通信处理?

更新:让我们有简单的过程

start() -> loop(0).

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

什么是最简单的(琐碎的:没有gen_server,yapp)从Web访问进程的方法?

也许,我需要一个最小的例子,gen_server + yapp + yaws / appmods + yaws。

#arg结构是雅司程序员非常重要的数据结构。 在ARAW of Yaws out / 1中,有一个可以保存用户状态的变量。

“state,%%状态供out / 1回调的用户使用”

您可以在此处获取详细信息。

在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等中

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM