Многопользовательское редактирование на сложной странице с помощью сервера push
Я использую Zend Framework для приложения под названием Pricetag, и мы думаем добавить поддержку многопользовательского редактирования в реальном времени. В основном идея состоит в том, чтобы на каждом из 4 шагов иметь возможность делиться тем, что вы редактируете с другими пользователями в интернете (так же, как это делает Pivotal Tracker или Trello).
Это скриншот самой сложной (программно говоря) из четырех страниц, которые у нас есть:
Внутренний HTML не важен (но Эй, вы можете зарегистрироваться в качестве бесплатного пользователя, если хотите проверить это), в основном некоторые входные данные и возможность добавлять / удалять эти блоки ("результаты "и" задачи") с помощью javascript.
Я предполагаю, что мне нужен какой-то способ для сервера, чтобы уведомить каждого онлайн-клиента об изменениях на странице. Я уже делаю запрос каждый раз, когда вы что-то меняете (белый блок справа обновляется каждый раз, когда вы это делаете), но я не знаю точно, как другие пользователи получат эту информацию.
Опрос сервер каждые 5 секунд или около того кажется очень и очень неправильным. Сайт использует PHP, этого достаточно, чтобы сделать это? Должен ли я взаимодействовать с отдельным скриптом на сервере? Есть ли уже построенный модуль Zend Framework, который я пропустил, хотя сначала спросил Google?
4 ответа:
Попробуйте этот сервер комет - http://dklab.ru/lib/dklab_realplexor/
Он имеет PHP и javascript API, смотрите примеры в песочнице - http://rutwit.ru/realplexor/demo
Comet server написан на perl, исходные и tarball файлы доступны здесь - http://github.com/DmitryKoterov/dklab_realplexor/tarball/master
См. другие технологии -
Веб-Сервер Торнадо . Веб-сервер написан на Python, это не только сервер comet - это фреймворк, где можно создать сервер комет.
NginxHttpPushModule : простой модуль для веб-сервера nginx, который добавляет поддержку Comet.
Принятый в cometd: масштабируемые основе HTTP автобусного маршрута событием, которое использует Аякс толчок. Поддерживается подписка на многие каналы.
APE : это скорее каркас для построения кометных систем, чем готовый продукт.
Stardust - Простой кометный сервер на perl (Комментарий автора- " самый простой Сервер комет я могу себе представить").
Orbited : эмуляция TCP сокетов в JavaScript.
Взгляните на socket.io библиотека. Он использует множество методов для асинхронного уведомления клиентов.
Некоторое время назад мы экспериментировали с использованием Comet для своего рода чат-клиента. Основная предпосылка заключается в том, что вы открываете соединение (скорее всего, запрос AJAX) с веб-сервером и держите его открытым до тех пор, пока либо
- тайм-аут истекает (скажем, через 30 секунд),
- или возникает некоторое состояние приложения, требующее отправки данных клиенту.
В этот момент запрос возвращается. Если есть полезная нагрузка, примените все, что нужно сделать, а затем снова сделайте запрос, который начинается процесс закончен.
Единственным серьезным недостатком, с которым мы столкнулись, было то, что многие соединения оставались открытыми (просто сидя там в ожидании ответа), мы быстро исчерпали количество потоков в Apache, и будущие были остановлены. В тот момент мы отказались от этого упражнения (по другим причинам, однако), поэтому никогда не рассматривали возможные исправления.
Другой проблемой было заставить отдельные потоки PHP разговаривать друг с другом, что было также непросто. Насколько я помню, мы в конечном итоге использовали что-то построенное на сокетах, и каждый поток может говорить с другим, учитывая уникальный идентификатор (я сам не работал над этим битом, поэтому я не уверен, что это полностью правильно). В вашем случае вы можете проверить время mod в БД или файле, а затем вернуться, когда произойдет модификация.
Я бы предположил, что с тех пор, как мы попытались это сделать (это было несколько лет назад), дела пошли бы лучше, но я подозреваю, что общая идея все еще остается, и библиотеки воспользовались этим.
Многие из" push " библиотек фактически возвращаются к опросу сервера каждые несколько секунд.
Мы реализовали скрипт чата, чтобы сохранить соединение открытым, но это привело к проблемам с некоторыми клиентами и их брандмауэрами. Я бы больше так не поступила. Если вы держите соединение открытым, не используйте HTTP на порту 80.
Это также вопрос того, что делает скрипт PHP. Выполнение запроса базы данных каждые несколько секунд к каждому клиенту может быть медленным. Мы обошли это с помощью написания статического HTML файл, который ajax опрашивал каждые несколько секунд на предмет изменений. В большинстве случаев сервер сообщал, что не изменился (301?). Это крошечная нагрузка на сервер и часто дополнительно минимизируется HTTP Keep-alive. Если вы все еще думаете, что не можете загрузить свой сервер, вы также можете арендовать веб-пространство для размещения статических файлов.