Многопользовательское редактирование на сложной странице с использованием push-сообщений сервера - PullRequest
6 голосов
/ 16 ноября 2011

Я использую Zend Framework для приложения под названием Pricetag , и мы думаем о добавлении поддержки многопользовательского редактирования в реальном времени. По сути, идея состоит в том, чтобы на каждом из 4 этапов иметь возможность поделиться тем, что вы редактируете, с другими пользователями в сети (во многом как Pivotal Tracker или Trello делает).

Это скриншот самой сложной (программно говоря) из четырех страниц, которые у нас есть:

Pricetag Step 2 screenshot

Внутренний HTML не важен (но, эй, вы можете зарегистрироваться как свободный пользователь, если хотите проверить его), в основном некоторые входные данные и возможность добавлять / удалять эти блоки («результаты» и «задачи») с JavaScript.

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

Опрос сервера каждые 5 секунд или около того кажется очень-очень неправильным. Сайт использует PHP, достаточно ли этого для этого? Должен ли я взаимодействовать с отдельным скриптом на сервере? Есть ли уже встроенный модуль Zend Framework, который мне не хватает, хотя я сначала спросил у Google?

Ответы [ 4 ]

6 голосов
/ 23 ноября 2011

Попробуйте этот комет-сервер - http://dklab.ru/lib/dklab_realplexor/

Он имеет PHP и API JavaScript, примеры приведены в песочнице - http://rutwit.ru/realplexor/demo

Сервер Comet, написанный на Perl, исходный файл и файлы tarballдоступны здесь - http://github.com/DmitryKoterov/dklab_realplexor/tarball/master

см. другие технологии -

Веб-сервер Tornado .Веб-сервер написан на Python, это не только комет-сервер - это фреймворк, в котором вы можете создать комет-сервер.

NginxHttpPushModule : простой модуль для веб-сервера nginx, который добавляет поддержку Comet.

CometD : масштабируемая шина маршрутизации событий на основе HTTP, использующая Ajax Push.Поддерживается подписка по многим каналам.

APE : это скорее фреймворк для построения комет-систем, чем готовый продукт.

Stardust - простой COMETсервер в perl (комментарий автора - «самый простой сервер COMET, который я мог представить»).

Orbited : эмуляция TCP-сокетов в JavaScript.

2 голосов
/ 16 ноября 2011

Взгляните на библиотеку socket.io . Он использует несколько методов для асинхронного уведомления клиентов.

1 голос
/ 18 ноября 2011

Мы экспериментировали с использованием Comet для своего рода чата.Основная предпосылка заключается в том, что вы открываете соединение (вероятно, AJAX-запрос) с веб-сервером и держите его открытым до тех пор, пока не истечет

  • Время ожидания (скажем, 30 секунд), * ​​1006 *
  • или некотороевозникает состояние приложения, которое требует отправки данных клиенту.

В этот момент запрос возвращается.Если есть полезная нагрузка, примените все, что нужно сделать, а затем повторите запрос, который снова запустит процесс.

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

Другая проблема заключалась в том, чтобы заставить отдельные потоки PHP общаться друг с другом, что также было нелегким делом.Насколько я помню, в итоге мы использовали что-то, построенное на сокетах, и каждый поток мог общаться с другим с уникальным идентификатором (я сам не работал над этим битом, поэтому я не уверен, что это полностью правильно).В вашем случае вы можете проверить время модификации на БД или файле, а затем вернуться, когда произойдет изменение.

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

0 голосов
/ 25 ноября 2011

Многие из библиотек «push» фактически возвращаются к опросу сервера каждые несколько секунд.

Мы реализовали скрипт чата, чтобы держать соединение открытым, но это привело к проблемам с некоторыми клиентами и их брандмауэрами.Я бы не стал делать это снова.Если вы оставляете соединение открытым, не используйте HTTP на порту 80.

Это также зависит от того, что делает PHP-скрипт.Выполнение запроса к базе данных каждые несколько секунд для каждого клиента может быть медленным.Мы обошли это, написав статический HTML-файл, который ajax опрашивал каждые несколько секунд на предмет изменений.В большинстве случаев сервер сообщал об отсутствии изменений (301?).Это крошечная нагрузка на сервер, которая часто минимизируется HTTP-поддержкой активности.Если вы все еще думаете, что не можете загрузить свой сервер, вы также можете арендовать веб-пространство для размещения статических файлов.

...