2

我想知道每次新客户端使用其 Web 服务器时在 YAWS 中正​​在执行哪些代码......

首先,我试图了解 YAWS 如何处理并发用户......并尝试以下 .yaws 页面:

io:format("~nProcess Identifier: ~p  Port: ~p  Client: ~p  YAWS pid: ~p ~n",[self(), A#arg.clisock, A#arg.client_ip_port, A#arg.pid]).

它应该返回每个客户端的 Pid 、端口和 ip ......我在同一个浏览器(Firefox)上打开了这个页面并打开了两个不同的选项卡......这是打印的:

Process Identifier: <0.65.0>  Port: #Port<0.1211>  Client: {{127,0,0,1},60451}  YAWS pid: <0.65.0> 

Process Identifier: <0.65.0>  Port: #Port<0.1211>  Client: {{127,0,0,1},60451}  YAWS pid: <0.65.0> 

由于某种原因,返回了相同的端口和 pid(因此,YAWS 没有为每个客户端创建新端口或新 pid)。

当我在 Chrome 上尝试这个时,打印出来的是:

Process Identifier: <0.71.0>  Port: #Port<0.2998>  Client: {{127,0,0,1},60543}  YAWS pid: <0.71.0> 

Process Identifier: <0.71.0>  Port: #Port<0.2998>  Client: {{127,0,0,1},60543}  YAWS pid: <0.71.0> 

因此,为什么 YAWS 没有为同一浏览器上的每个选项卡打开新的端口或 pid?另外,回到最初的问题,YAWS 在哪里以及哪些代码会产生一个新的 PID 或打开一个新的端口?

谢谢

4

1 回答 1

6

除非您确定您的浏览器会为每个选项卡打开新的 HTTP 连接,否则您并没有真正测试您认为正在测试的内容。相反,请从命令行尝试:

curl http://yaws_host:yaws_port/path/to/your/yaws/page.yaws
curl http://yaws_host:yaws_port/path/to/your/yaws/page.yaws    

是的,运行两次,因为这保证使用两个单独的连接。然后你会看到 Yaws 使用两个不同的 Erlang 进程和 TCP 连接来处理这两个请求:

Process Identifier: <0.59.0>  Port: #Port<0.1181>  Client: {{127,0,0,1},64977}  YAWS pid: <0.59.0>
Process Identifier: <0.64.0>  Port: #Port<0.3268>  Client: {{127,0,0,1},64978}  YAWS pid: <0.64.0>

至于处理连接的 Yaws 代码在哪里,您可以查看yaws_server.erl,特别是acceptor/1启动进程以接受连接的do_listen/2函数和打开套接字进行侦听的函数。

于 2013-04-20T16:01:19.430 回答