我希望每次新客户端使用其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]).
Run Code Online (Sandbox Code Playgroud)
应该返回每个客户端的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>
Run Code Online (Sandbox Code Playgroud)
由于某种原因,返回相同的端口和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>
Run Code Online (Sandbox Code Playgroud)
因此,为什么YAWS不为同一浏览器上的每个标签打开一个新端口或pid?另外,回到原来的问题,YAWS在哪里和哪个代码产生新的PID或打开一个新的端口?
谢谢
除非您确定您的浏览器为每个选项卡打开了新的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
Run Code Online (Sandbox Code Playgroud)
是的,运行两次,因为保证使用两个单独的连接.然后,您将看到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>
Run Code Online (Sandbox Code Playgroud)
至于用于处理连接的Yaws代码所在的位置,您可以查看yaws_server.erl,特别是在acceptor/1启动进程以接受连接的do_listen/2函数和打开用于侦听的套接字的函数中.