我希望每次新客户使用其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或打开一个新的端口?
由于
答案 0 :(得分: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
函数打开插座听。