"Соединение: Keep-Alive" в ответе сервера

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

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

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

header("Connection: Keep-alive");

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

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

Спасибо заранее.

P.S.: Понюхав пакеты, я заметил, что не многие сайты используют "Keep-alive", и TCP-соединение восстанавливается. Не является ли Keepalive стандартным и предпочтительным поведением в HTTP 1.1?

Ответ 1

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

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

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

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

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

Ответ 2

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

KeepAlive On