Я пытаюсь установить постоянное соединение HTTP из приложения Silverlight на страницу PHP (т. Е. Без создания нового TCP-соединения для каждого HTTP-запроса), размещенного сервером Apache.
Для этого мне нужно, чтобы веб-сервер отправлял свои HTTP-ответы с заголовком «Connection», установленным в «Keep-alive». На стороне клиента, похоже, нет никаких проблем, поскольку сетевой API, предоставляемый Silverlight, в основном представляет собой оболочку сетевых возможностей браузера, из того, что я читал: поэтому, если браузер поддерживает HTTP 1.1 и Connection: Keep-Alive по умолчанию для его запросов это нормально. Content-Length также хорошо определен, так что сервер знает, когда он должен отправить ответ. Тем не менее, ответ сервера на запрос PHP систематически устанавливает «Connection:» для «закрытия», тем самым прекращая соединение и предотвращая постоянное соединение.
Я пробовал кое-что, чтобы обойти эту проблему: разные методы (GET и POST), явно предоставляя ответ «Соединение: сохранить-оживить» со следующим кодом PHP в начале моего скрипта:
header("Connection: Keep-alive");
Последний добавляет ожидаемый заголовок к ответу, что хорошо, но добавление «Connection: close» по-прежнему добавляется позже в заголовках ответов.
Является ли это особенностью PHP или Apache, которая обеспечивает «закрытие» (для определенной цели безопасности или производительности, я предполагаю), или я просто что-то пропустил здесь?
Заранее спасибо.
PS: Понюхав пакеты, я заметил, что не многие сайты используют «Keep-alive», и TCP-соединение восстанавливается. Не является ли Keepalive стандартным и предпочтительным поведением в HTTP 1.1?
Функциональность Keep-Alive не предназначена для постоянных подключений.
Keep-Alive предназначен для сокращения количества подключений для веб-сайта. Вместо того, чтобы создавать новое соединение для каждого изображения / css / javascript на веб-странице, многие запросы будут повторно использоваться с тем же соединением.
В Apache есть некоторые настройки, которые предотвращают это, например максимальное количество запросов на соединение или таймауты между запросами. Это также будет очень быстро потреблять ваши ресурсы, потому что каждому соединению нужен собственный поток.
Вы должны перейти на другое решение, предназначенное для такого рода работ.
Для служб, которые поддерживают ваше соединение, вы можете взглянуть на http://orbited.org и http://twistedmatrix.com/trac/
Поскольку PHP не управляет HTTP-соединением, у него нет способа изменить этот параметр. Вы должны установить это на серверах. Например, вы можете включить keep-alive, как это в Apache, если вы используете mod_php,
KeepAlive On