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