在单个消息处理程序结束之前,Kamailio 伪变量 $var 是否可以安全使用?
Are Kamailio pseudo-variables $var safe to use until the end of a single message handler?
我在 Kamailio 中使用伪变量 $var,因为根据文档,它们比 $dlg_var 更快,但我想知道像这样使用它们是否安全:
jansson_get("a", $http_rb, "$var(a)");
$var(i) = 0;
jansson_array_size("elements", $http_rb, "$var(elements_size)");
while($var(i) < $var(elements_size)) {
jansson_get("elements[$var(i)].key", $http_rb, "$var(key)");
jansson_get("elements[$var(i)].value", $http_rb, "$var(value)");
insert_hf("$var(key): $var(value)\r\n");
$var(i) = $var(i) + 1;
}
if ($var(a) == "some value") {
route(RELAY);
}
我尝试在配置文件中使用一个进程设置 Kamailio,只是为了查看一个 Kamailio 进程如何处理消息。然后我同时进行了两次调用,根据我的日志,消息似乎是同时处理的(我不确定一个 Kamailio 进程中是否有多个线程)。
所以,我的问题是:并发消息是否有可能覆盖 $var 的值(因为它是同一 Kamailio 进程处理的所有消息的共享变量)并且是否有安全的方式使用 $var尽量减少或消除这种可能性?
我阅读了文档并指出:
"Note: A script variable persists over the Kamailio process in which it was initialized, so be sure of giving it a new value before reading it or you'll get the value asigned in any other previous message processed by the same Kamailio process (pid)."
这个注释让我觉得消息是按顺序处理的,或者至少我可以在处理单个消息时安全地使用 $var。我如何确保我提供的价值在我仍在使用时不会改变?
在新消息循环开始时清除 $vars 变量的值。
所以对于单条消息来说,是安全的。
Kamailio 运行 X 线程(可在 config/at 启动时配置),主循环将每条消息发送到其中一个线程。这样处理就可以并发并使用所有 CPU。
并发处理不是覆盖$var(x) 变量,$var(x) 的值存储在进程的私有内存中。 Kamailio 不使用线程来处理 SIP 流量,只有当您将 Kamailio 配置为启动多个 SIP 工作进程时,才能并行处理 SIP 消息。
换句话说,查看您的示例,在处理该特定 SIP 消息时不能覆盖 $var(a),无论其他 SIP 工作进程处理了多少其他 SIP 消息。 $var(a) 值将在下一次同一 SIP 工作进程处理新消息和 jansson_get("a", "$http_rb", "$var(a)" ) 使用 $http_rb.
的不同值再次执行
附带说明一下,$http_rb 不是标准 Kamailio 发行版的有效变量,但我猜你要么写了自己的扩展名,要么是为了这个例子而给出的。
如果您想要一个范围是 SIP 事务而不是进程(子)的变量,您可能想要使用 $avp。
我在 Kamailio 中使用伪变量 $var,因为根据文档,它们比 $dlg_var 更快,但我想知道像这样使用它们是否安全:
jansson_get("a", $http_rb, "$var(a)");
$var(i) = 0;
jansson_array_size("elements", $http_rb, "$var(elements_size)");
while($var(i) < $var(elements_size)) {
jansson_get("elements[$var(i)].key", $http_rb, "$var(key)");
jansson_get("elements[$var(i)].value", $http_rb, "$var(value)");
insert_hf("$var(key): $var(value)\r\n");
$var(i) = $var(i) + 1;
}
if ($var(a) == "some value") {
route(RELAY);
}
我尝试在配置文件中使用一个进程设置 Kamailio,只是为了查看一个 Kamailio 进程如何处理消息。然后我同时进行了两次调用,根据我的日志,消息似乎是同时处理的(我不确定一个 Kamailio 进程中是否有多个线程)。
所以,我的问题是:并发消息是否有可能覆盖 $var 的值(因为它是同一 Kamailio 进程处理的所有消息的共享变量)并且是否有安全的方式使用 $var尽量减少或消除这种可能性?
我阅读了文档并指出:
"Note: A script variable persists over the Kamailio process in which it was initialized, so be sure of giving it a new value before reading it or you'll get the value asigned in any other previous message processed by the same Kamailio process (pid)."
这个注释让我觉得消息是按顺序处理的,或者至少我可以在处理单个消息时安全地使用 $var。我如何确保我提供的价值在我仍在使用时不会改变?
在新消息循环开始时清除 $vars 变量的值。
所以对于单条消息来说,是安全的。
Kamailio 运行 X 线程(可在 config/at 启动时配置),主循环将每条消息发送到其中一个线程。这样处理就可以并发并使用所有 CPU。
并发处理不是覆盖$var(x) 变量,$var(x) 的值存储在进程的私有内存中。 Kamailio 不使用线程来处理 SIP 流量,只有当您将 Kamailio 配置为启动多个 SIP 工作进程时,才能并行处理 SIP 消息。
换句话说,查看您的示例,在处理该特定 SIP 消息时不能覆盖 $var(a),无论其他 SIP 工作进程处理了多少其他 SIP 消息。 $var(a) 值将在下一次同一 SIP 工作进程处理新消息和 jansson_get("a", "$http_rb", "$var(a)" ) 使用 $http_rb.
的不同值再次执行附带说明一下,$http_rb 不是标准 Kamailio 发行版的有效变量,但我猜你要么写了自己的扩展名,要么是为了这个例子而给出的。
如果您想要一个范围是 SIP 事务而不是进程(子)的变量,您可能想要使用 $avp。