Чи може WordPress зробити так, щоб підтримувати веб-розетки?


18

Веб-розетки - це класна, найсучасніша технологія, загорнута в HTML5. В основному, ви можете відкрити веб-розетку, щоб забезпечити постійне, двостороннє спілкування з веб-сервером. Клієнт (інтерфейс користувача) може самовільно надсилати повідомлення, а сервер також може надсилати повідомлення.

Існуюча технологія (JavaScript) вимагає, щоб все починалося клієнтом - сервер не може надсилати клієнту нічого, чого клієнт не запитує. Тому сценарії потрібно постійно оновлювати та повторно запитувати дані, які, можливо, не змінилися. Веб-розетки працюють більше на принципі " натискання " і дозволяють нові дані надходити кожен раз.

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

Це, очевидно, працює, але це має деякі недоліки.

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

Отже, для когось із вас, хто має досвід, як би ви зробили WordPress сумісним із веб-розетками? Ви б змусили WordPress керувати самим спілкуванням або з’єднати інший міні-серверний скрипт у плагін? Якщо ви вже зробили це, як ви це зробили, не порушуючи WordPress?

Можливі ресурси?


9/21/11 Оновлення

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

Статистика запитує вміст від Automattic. Akismet посилає дані назад і назад із зовнішнього сервера. Після того, як Кінцевий термін подає вміст у час публікації Кілька інструментів SEO передають речі назад і назад через зовнішні системи.

Отже, як альтернатива розміщенню коду websocket у плагіні WordPress, чи можливо зробити розміщення служби веб-сокетів у центральному місці, а замість цього взаємодіє фронтмен WordPress?


3
Суть полягає в наступному: Якщо веб-розетки не працюють добре з рідним веб-сервером, ви не можете легко зробити це з цим веб-сервером. Це не специфічна для WordPress проблема. Як ви заявили, для веб-сокетів, як правило, потрібен окремий сервер, наприклад node.js або щось подібне, вони зовсім не будуть працювати з Apache. Таким чином, ваше питання не є одним із "як зробити його сумісним з WordPress", це "як змусити його працювати на найнижчому загальному знаменнику хостингу", який є зовсім іншим чайником риби.
Отто

Підтримка WebSocket може бути додана до ядра WordPress, із вбудованим сервером WebSocket та кінцевою точкою, як адміністратор-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 та порті) знаходиться веб-розетка.


2

Забудьте для цього "класичний" 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 і сподіваємось, що користувачі а) це зрозуміють або б) зможуть зробити що-небудь щодо це.
EAMann

apache2-mpm-prefork не був розроблений таким чином, щоб мати можливість обробляти подібне використання. Є плагіни, які вимагають memcached, APC тощо, тому для цього може знадобитися лише веб-сервер на основі подій. Це вимога до бекенда, mpm-prefork і mpm-worker не для цього.
петермольнар

1

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

Можливим недоліком є ​​те, що інші люди, які намагаються використовувати ваш плагін, також повинні мати обліковий запис Pusher, щоб він працював. З цим набагато простіше працювати, ніж встановлювати власний сервер Web Sockets і потребувати його підтримки, це насправді буде перевагою насправді, коли справа доходить до інших, хто намагається використовувати ваш плагін.


0

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


1
"потік доходу, щоб забезпечити такі зручності" ... що було б добре :-)
EAMann
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.