2013-04-19 6 views
2

Я хотел бы знать, какой код выполняется в Yaws каждый раз, когда новый клиент использует свой веб-сервер ...Как обрабатывать 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 или открывает новый порт?

Благодаря

ответ

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, которая открывает сокеты для прослушивания.