Можно ли заставить WordPress поддерживать WebSockets?
WebSockets — это современная технология, встроенная в HTML5. По сути, вы можете открыть websocket-соединение для установления постоянного двустороннего обмена данными с веб-сервером. Клиент (пользовательский интерфейс) может спонтанно отправлять сообщения, и сервер также может отправлять сообщения.
Существующие технологии (JavaScript) требуют, чтобы все инициировалось клиентом — сервер не может отправить клиенту ничего, что клиент не запросил. Поэтому скриптам приходится постоянно обновлять и повторно запрашивать данные, которые могли не измениться. WebSockets работают по принципу "push", позволяя новым данным поступать в любое время.
К сожалению, большинство (если не все) реализаций WebSockets требуют наличия специального серверного приложения. Обычно люди запускают Apache на портах 80 и 443 (http и https), а другую систему (чаще всего Node.js) на другом порту (например, 8000 или 8080) для обработки websocket-запросов.
Это работает, но имеет некоторые недостатки.
У меня есть плагин, который мог бы значительно выиграть от использования WebSockets в WordPress. Но если пользователю требуется установить второй веб-сервер (что обычно невозможно для пользователей shared-хостинга), то это не будет работать как плагин.
Итак, для тех, у кого есть опыт: как сделать WordPress совместимым с WebSockets? Стоит ли заставить WordPress обрабатывать соединение самостоятельно или включить в плагин дополнительный мини-сервер? Если вы уже делали это, как вы реализовали это без поломки WordPress?
Возможные ресурсы:
Обновление от 21.09.11
Учитывая все разговоры о том, что Apache (наиболее часто используемый сервер для WordPress на shared-хостинге) не поддерживает WebSockets нативно, я задумался об альтернативе. Несколько плагинов (например, JetPack) взаимодействуют с внешними сервисами или API для генерации контента.
Stats запрашивает контент у Automattic. Akismet обменивается данными с внешним сервером. After the Deadline отправляет контент при публикации. Некоторые SEO-инструменты передают данные через внешние системы.
Так что, в качестве альтернативы размещению websocket-кода внутри плагина WordPress, будет ли целесообразно разместить websocket-сервис в централизованном месте и организовать взаимодействие WordPress-интерфейса с ним?

WebSockets используют протокол websockets: WS:/example.com/yourscript.js и открывают синхронное соединение — это означает, что соединение остается открытым и выделено для браузера.
HTTP-серверы, такие как apache2 (используемые большинством провайдеров shared-хостинга), используют протокол HTTP: http://example.com/yourscript.js
и открывают асинхронное соединение — это означает, что между сервером и браузером не поддерживается постоянное соединение. (Можно немного продлить открытые соединения, установив определенные параметры конфигурации, но в целом соединение остается асинхронным.)
Как можно догадаться, поддержание открытых соединений между браузером и сервером выделяет больше серверных ресурсов для каждого соединения с браузером и, следовательно, сильнее нагружает сервер, чем разрыв соединений после каждого запроса. Провайдеры shared-хостинга закономерно не склонны поддерживать WS на общих хостингах.
Хотя некоторые shared-хосты могут иметь установленный mod_python, что позволяет пользователям вашего плагина запускать pywebsocket, документация pywebsocket явно указывает, что "pywebsocket предназначен для тестирования или экспериментальных целей."
Таким образом, хотя можно представить плагин, включающий Python-код для создания сервера pywebsocket (если сервер Apache поддерживает его), я не считаю разумным распространять плагин, который это делает.

Отвечая на ваше обновление, по моему мнению и на основе проведённых мной исследований, это будет самым оптимальным вариантом. Ещё лучше было бы создать фронтенд-плагин и внешний сервис на основе WebSocket для взаимодействия с плагинами, а также взимать плату за его использование, если вы хотите монетизировать свою идею. Вы даже можете предоставить исходный код для WebSocket-сервиса и добавить настройку в плагине для указания, где (какой домен/IP и порт) расположен этот сервис.

Забудьте о "классическом" apache2 - apache2-mpm-prefork - для этой цели. Возможно, apache2-mpm-event справится с этим, но он экспериментальный. Поскольку apache2 не является событийно-ориентированным, проблема, описанная @marfarma, действительно существует. Для такого рода задач вам понадобится событийно-ориентированный веб-сервер, например cherokee или nginx.
nginx может быть действительно полезен для WordPress (так как wordpress.com также использует его в качестве сервера), и он может проксировать определенные запросы, например, к сервису node.js.
Некоторые примеры по теме:
Я также сделал небольшой туториал по настройке nginx + php-fpm + WordPress.

Забыть "классический" подход - не вариант для создания плагина, который будет легко установить обычным пользователям. Да, использование nginx, cherokee или node.js для обработки запросов на сервере - это вариант, но нельзя просто написать это в readme плагина и надеяться, что пользователи а) поймут это или б) смогут что-то с этим сделать.

apache2-mpm-prefork не был разработан для обработки такого типа нагрузки. Существуют плагины, требующие memcached, APC и т.д., поэтому здесь может потребоваться событийно-ориентированный веб-сервер. Это требование к серверной части, mpm-prefork и mpm-worker для этого не подходят.

Еще одно возможное решение — использовать стороннего провайдера веб-сокетов. Я немного экспериментировал с Pusher (http://pusher.com/), у них есть API, который может хорошо подойти для ваших задач. Я размышлял, как можно интегрировать его в свои WordPress-сайты.
Недостаток в том, что другим пользователям вашего плагина также придется заводить аккаунт в Pusher для его работы. Однако это гораздо проще, чем устанавливать и поддерживать собственный Web Sockets сервер. На самом деле, это даже преимущество, когда речь идет о других пользователях вашего плагина.

Короткий ответ: да, это возможно. Однако я бы рассмотрел что-то более распределенное, чем единую точку отказа в виде VPS, который вы хостите. Может, стоит взглянуть на балансировку нагрузки в EC2 или что-то подобное? (Предполагаю, что у вас есть доход, позволяющий позволить себе такие удобства. ухмылка)
