我希望知道每次新客户端使用其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或打开新的端口?
谢谢
发布于 2013-04-21 00:01:19
除非您确定浏览器为每个选项卡都打开了新的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函数。
https://stackoverflow.com/questions/16103488
复制相似问题