gpt4 book ai didi

erlang - 是否可以在运行时添加 YAWS appmods 配置?

转载 作者:行者123 更新时间:2023-12-01 14:38:04 26 4
gpt4 key购买 nike

我在生产环境中将 YAWS 嵌入到我的应用程序中,并使用函数 yaws:start_embedded/4 来启动 YAWS。

下面是我的代码:

Id = "my_server",
GconfList = [{logdir, "./log"}, {id, Id}],
SconfList = [{docroot, Docroot},
{port, Port},
{listen, Listen},
{appmods, [
{"/rest", mod_rest, []},
{"/file", mod_file, []}
]}
],
yaws:start_embedded(Docroot, SconfList, GconfList, Id).

我想添加另一个 appmod,例如:{"/upload", mod_upload, []}

是否可以在运行时添加应用程序模块而无需重新启动 YAWS?

最佳答案

您可以在运行时添加 appmod,方法是首先检索当前配置,使用它创建包含新 appmod 的新配置,然后设置新配置。

  1. 调用 yaws_api:getconf/0 获取三元组 {ok, GlobalConf, ServerConfs},其中 GlobalConf 是全局 Yaws 配置ServerConfs 是 Yaws 服务器配置列表的列表。全局conf是名为gconf的记录类型,服务器conf是名为sconf的记录类型;这两种记录类型均在 yaws.hrl 头文件中定义。
  2. 检查服务器配置,找到包含您要更改的应用程序模块的配置。这有点棘手,因为您正在处理列表的列表,并且需要保持整体数据结构的形状不变。
  3. 找到 sconf 后,通过将新 appmod 添加到其当前的 appmod 列表来从中创建一个新的 sconf 实例。 appmod 列表的每个元素都是一个元组,由 appmod 的 URL 路径和 appmod 模块的名称组成。 appmod 元组还可以选择包含第三个字段,该字段由要排除的第一个路径下的路径列表组成;请参阅 the Yaws appmod documentation 中对 exclude_paths 的描述了解更多详情。
  4. ServerConfs 中现有的 sconf 值替换为您的新值。
  5. 调用 yaws_api:setconf/2 设置新配置,传递现有的 GlobalConf 作为第一个参数,并传递包含您的新 ServerConfs新的 sconf 作为第二个参数。

下面的 am_extend 模块展示了如何执行此操作。它导出一个 add/1 函数,该函数采用的函数可以识别和增强您关心的特定服务器中的 appmod。

-module(am_extend).
-export([add/1]).

add(AppmodAdder) ->
{ok, GlobalConf, ServerConfs} = yaws_api:getconf(),
NewServerConfs = add_appmod(ServerConfs, AppmodAdder),
yaws_api:setconf(GlobalConf, NewServerConfs).

add_appmod(ServerConfs, AppmodAdder) ->
lists:foldl(fun(Val, Acc) ->
Acc ++ [AppmodAdder(A) || A <- Val]
end, [], ServerConfs).

使用此代码的一个示例是将下面的函数作为 am_extend:add/1AppmodAdder 参数传递。在此示例中,我们正在寻找具有 appmod 路径 "/sse" 的服务器,以便我们可以为该路径 "/sse2" 添加另一个 appmod 到该服务器。我们不关心的任何服务器配置都会原封不动地返回。

-include_lib("yaws/include/yaws.hrl").

add_sse2(#sconf{appmods=AM}=SC) ->
case lists:keyfind("/sse", 1, AM) of
false ->
SC;
_ ->
SC#sconf{appmods=[{"/sse2", my_sse_module}|AM]}
end.

请注意,我们的 add_sse2/1 函数必须包含 yaws.hrl 进行编译,以便它具有可用的 sconf 记录的定义。

关于erlang - 是否可以在运行时添加 YAWS appmods 配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40623930/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com