Можно ли сделать WordPress для поддержки веб-сокетов?


18

Websockets - это крутая, передовая технология, встроенная в HTML5. По сути, вы можете открыть веб-сокет, чтобы обеспечить постоянную двустороннюю связь с веб-сервером. Клиент (пользовательский интерфейс) может самопроизвольно отправлять сообщения, и сервер также может отправлять сообщения.

Существующая технология (JavaScript) требует, чтобы все было запущено клиентом - сервер не может отправить клиенту ничего, что клиент не имеет запросов. Таким образом, скрипты должны постоянно обновлять и повторно запрашивать данные, которые могли не измениться. Веб-сокеты работают больше в режиме « push » и позволяют новым данным поступать по конвейеру в любое время.

К сожалению, большинство (в любом случае, все, что я могу найти) реализаций веб-сокетов требует определенного серверного приложения для работы. Люди будут запускать Apache на портах 80 и 443 (http и https) и запускать другую систему (обычно Node.js) на другом порту (например, 8000 или 8080) для обработки запросов веб-сокетов.

Это работает, очевидно, но у него есть некоторые недостатки.

У меня есть плагин, который я хочу создать, который очень выиграл бы от использования веб-сокетов в WordPress. Но если пользователю необходимо установить второй веб-сервер (обычно это невозможно для людей с общим хостингом), он не будет работать как плагин.

Итак, для любого из вас, у кого есть опыт, как бы вы сделали WordPress совместимым с веб-сокетами? Сделаете ли вы, чтобы WordPress обрабатывал сам обмен сообщениями, или включил в плагин другой скрипт мини-сервера? Если вы уже сделали это, как вы сделали это, не сломав сам WordPress?

Возможные ресурсы?


21.09.11 Обновление

Несмотря на все разговоры о том, что Apache (наиболее часто устанавливаемый сервер для запуска WP на общем хосте) не может действительно обрабатывать веб-сокеты изначально, я задаюсь вопросом об альтернативе. Несколько плагинов (например, JetPack) общаются с внешним сервисом или API для генерации контента.

Статистика запрашивает контент у Automattic. Akismet отправляет данные туда и обратно с внешнего сервера. После окончания срока подачи контента на момент публикации. Несколько инструментов SEO передают информацию через внешние системы.

Таким образом, в качестве альтернативы размещению кода веб-сокета в плагине WordPress, было бы целесообразно разместить службу веб-сокетов в центральном месте и вместо этого взаимодействовать с ней веб-интерфейсу WordPress?


3
Суть в следующем: если веб-сокеты не работают должным образом с собственным веб-сервером, то вы не можете легко сделать это с этим веб-сервером. Это не проблема WordPress. Как вы сказали, для веб-сокетов обычно требуется отдельный сервер, такой как node.js или что-то в этом роде, они вообще не будут хорошо работать с Apache. Таким образом, ваша проблема не в том, «как мне сделать его совместимым с WordPress», а в том, «как мне заставить его работать на хостинге с наименьшим общим знаменателем», который представляет собой совершенно другую ловушку рыбы.
Отто

Поддержка WebSocket может быть добавлена ​​в ядро ​​WordPress, со встроенным сервером WebSocket и конечной точкой, такой как admin-ajax.php, нет? Существует также библиотека Socket.IO для WebSocket с интерфейсом JavaScript frontend / Node.js с опрашиванием в качестве запасного варианта, разработанная компанией Automattic, разработавшей WordPress.
baptx

Ответы:


8

WebSockets использует протокол websockets: WS: /example.com/yourscript.js и открывает синхронное соединение - это означает, что соединение остается открытым и предназначено для браузера.

Серверы httpd, такие как apache2 (используется большинством провайдеров общего хостинга), используют протокол http: http://example.com/yourscript.jsи открывают асинхронное соединение - это означает, что соединение между сервером и браузером не поддерживается. (Вы можете скромно продлить открытые соединения, установив определенные параметры конфигурации - но, вообще говоря, это асинхронно.)

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

Хотя на некоторых общих хостах может быть установлен mod_python, что позволяет пользователям вашего плагина запускать pywebsocket , в собственной документации pywebsocket четко указано, что «pywebsocket предназначен для тестирования или экспериментальных целей».

Поэтому, хотя можно представить плагин, связывающий код Python для создания сервера pywebsocket, с учетом сервера apache, который его поддерживает, я не верю, что когда-либо будет разумно распространять плагин, который это сделал.


Есть несколько простых библиотек PHP, которые утверждают, что поддерживают веб-сокеты. Будет ли они эффективно работать в Apache, было бы интересным тестом. Смотрите мое обновление для ссылок ...
EAMann

3

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


2

Для этого забудьте о «классическом» apache2 - apache2-mpm-prefork. Возможно, apache2-mpm-event справится с этим, но это экспериментально. Поскольку apache2 не управляется событиями, проблема, описанная @marfarma, существует. Для такого обслуживания вам понадобится управляемый событиями веб-сервер, например, чероки или nginx.

nginx может быть реальным преимуществом для WordPress (так как wordpress.com использует его и в качестве своего сервера) и может, например, передавать указанные запросы в службу node.js.

Несколько примеров в теме:

Я также сделал небольшое руководство по настройке nginx + php-fpm + wordpress .


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

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

1

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

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


0

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


1
«Поток доходов, чтобы обеспечить такие удобства» ... это было бы неплохо :-)
EAMann
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.