«Connection: Keep-Alive» в ответе сервера - PullRequest
13 голосов
/ 07 июня 2010

Я пытаюсь установить постоянное соединение HTTP из приложения Silverlight со страницей PHP (т.е. без создания нового соединения TCP для каждого запроса HTTP), размещенного на сервере Apache.

Для этого мне нужно, чтобы веб-сервер отправлял свои HTTP-ответы с заголовком «Connection», установленным в «Keep-alive». На стороне клиента, похоже, нет никаких проблем, так как сетевой API, предоставляемый Silverlight, по сути является оберткой сетевых возможностей браузера, из того, что я прочитал: так, если браузер поддерживает HTTP 1.1 и Connection: Keep-Alive по умолчанию для его запросов, это нормально. Content-Length также хорошо определен, так что сервер знает, когда он должен отправить ответ. Однако ответ сервера на запрос PHP систематически устанавливает «Соединение:» в «закрытие», тем самым разрывая соединение и предотвращая постоянное соединение.

Я пытался обойти эту проблему: разные методы (GET и POST), явно дающие «Connection: keep-alive» на ответ с помощью следующего PHP-кода в начале моего скрипта:

header("Connection: Keep-alive");

Последний добавляет ожидаемый заголовок к ответу, и это хорошо, но дополнительное «Соединение: закрыть» все еще добавляется позже в заголовки ответа.

Это особенность PHP или Apache, которая обеспечивает "закрытие" (я полагаю, в целях безопасности или производительности) или я просто что-то здесь упускаю?

Заранее спасибо.

P.S. Обнаружив пакеты, я заметил, что не многие веб-сайты используют «Keep-alive», и соединение TCP восстанавливается. Разве Keepalive не является стандартным и предпочтительным поведением в HTTP 1.1?

Ответы [ 2 ]

25 голосов
/ 07 июня 2010

Функция Keep-Alive не предназначена для постоянных соединений.

Keep-Alive предназначен для уменьшения количества подключений к веб-сайту. Вместо создания нового соединения для каждого изображения / css / javascript на веб-странице будет выполнено много запросов с повторным использованием этого соединения.

Существуют некоторые параметры, которые предотвращают это и в Apache, например, максимальное количество запросов на соединение или тайм-ауты между запросами. Это также очень быстро израсходует ваши ресурсы, потому что каждому соединению нужен собственный поток.

Вам следует перейти на другое решение, предназначенное для такой работы.

Для служб, которые поддерживают ваше соединение открытым, вы можете взглянуть на http://orbited.org и http://twistedmatrix.com/trac/

6 голосов
/ 07 июня 2010

Поскольку PHP не управляет HTTP-соединением, он не может изменить этот параметр. Вы должны установить это на серверах. Например, вы можете включить поддержку активности в Apache, если вы используете mod_php,

KeepAlive On
...