0

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

如何在 yaws 中维护简单的有状态服务?如何在“appmods”erl源文件中实现与进程的通信?

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

start() -> loop(0).

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

从 Web 访问进程的最简单(微不足道:没有 gen_server、yapp)方法是什么?

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

4

2 回答 2

2

#arg 结构对于 yaws 程序员来说是一个非常重要的数据结构。在 Yaws out/1 的 ARG 中有一个可以保存用户状态的变量。

"state, %% State 供 out/1 回调的用户使用"

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

于 2012-09-13T08:51:28.803 回答
0

在 Erlang 中访问进程只有两种方法:要么你知道它的 Pid(以及你期望进程所在的节点),要么你知道它的注册名称(以及它期望的 erlang 节点)。

假设你有你的 appmod:

-模块(myappmod)。
-出口([输出/1])。
-include("PATH/TO/YAWS_SERVER/include/yaws_api.hrl").
-include("PATH/TO/YAWS_SERVER/include/yaws.hrl").
出(Arg)-> case check_initial_state(Arg) 的 未知 -> create_initial_state(); {好的,值}-> UserPid = list_to_pid(值), 用户标识符!extract_request(Arg), 收到 响应 -> {html,format_response(响应)} 在 ?TIMEOUT -> {html,"request_timedout"} 之后 结尾 结尾。
check_initial_state(A)-> CookieObject = (A#arg.headers)#headers.cookie, case yaws_api:find_cookie_val("InitialState", CookieObject) 的 []->未知; 饼干-> {好的,饼干} 结尾。
extract_request(Arg)->
%% 从 POST 数据中获取请求或获取数据 Post__data_proplist = yaws_api:parse_post(Arg), Get_data_proplist = yaws_api:parse_query(Arg), %% 做很多其他的事情.... 请求 = remove_request(Post__data_proplist,Get_data_proplist), 要求。
这个简单的设置向您展示了如何使用流程来保存有关用户的信息。但是,使用过程并不好。进程确实会失败,因此您需要一种方法来恢复它们所持有的数据。

一种更好的方法是拥有一个关于您的用户的数据存储并拥有一个 gen_server 来进行查找。你可以使用Mnesia. 我不建议你使用网络上的进程来保持用户状态,无论你在做什么类型的应用程序,即使它是一个消息传递应用程序。Mnesia 或ETS表格可以保持状态,您需要做的就是查找。

使用更好的存储机制来保持进程以外的状态。流程是一个失败点。其他人使用 Cookie(和/或会话 cookie),其值以某种方式用于从数据库中查找某些内容。但是,如果您坚持需要进程,那么,有一种方法可以记住它们的 Pid 或注册名称。您可以将用户 Pid 存储到他们的会话 cookie 等中

于 2011-10-23T12:29:49.687 回答