Как я могу записать чат в режиме реального времени с помощью XAJAX и PHP?

Существует два принципиально разных подхода к реализации возможностей реального времени в Linux.

1) Исправьте существующее ядро ​​такими вещами, как исправления rt-preempt. В конечном итоге это приведет к полностью вытесняющему ядру

2) Двухъядерный подход (например, xenomai, RTLinux, RTAI, ...)

Есть много ошибок, переходящих с RTOS на Linux.

Может быть, вам действительно не нужен режим реального времени?

Я говорю о Linux реального времени в моем обучении: http://www.reliableembeddedsystems.com/embedded-systems_7. HTML

7
задан Bill the Lizard 19 September 2012 в 01:59
поделиться

4 ответа

Нет. Клиенты должны «опрашивать» сервер неоднократно.

Я думаю, что главное здесь - продумать дизайн взаимодействия. Хитрость заключается в том, чтобы заставить пользователя думать, что чат является мгновенным, но на самом деле он обновляется каждые 1, 2, 3 или 10 секунд.

Идеи:

1) Когда пользователь отправляет сообщение, показывать это прямо в чате и инициирует опрос.

2) Если опрос возвращается с несколькими сообщениями от других пользователей, не добавляйте их все сразу, фактически добавляйте их в течение 1-2 секунд или около того, с произвольным интервалом, что создает впечатление, что они входят «мгновенно» и независимо. (Если сразу приходит пачка сообщений, пользователь очень быстро понимает, что чат обновляется тут же, а не постоянно.)

3) Если пользователь бездействует в течение x времени. Снизьте частоту опроса до одного раза в 10 секунд или около того.

4) Если пользователь активен, то есть отправляет много сообщений, опрашивайте чаще.

5) Создайте статический файл для каждого канала, для которого вы пишете время чат последний раз обновлялся до. Например, файл chat-teenfun-lastupdate.txt имеет содержимое 1224934239 или любой другой формат времени, который вы предпочитаете. Обслуживайте этот файл статически и позвольте клиентам опросить этот файл, чтобы проверить, обновился ли канал, а не вызовите chat-poll.php? Ch = teenfun , который выполняет динамическую проверку. Статические файлы обслуживаются примерно в 10-100 раз быстрее, в зависимости от работы, связанной с динамическим скриптом, и он понадобится вам, когда вы соберете 250+ пользователей.

Удачи и получайте удовольствие!

/ 0

PS. В качестве альтернативы вы можете позволить клиентам выполнять ajax-вызовы сервера и держать их в «зависании». То есть вы принимаете их запрос и делаете вид, что начинаете отправлять данные обратно, но затем просто делаете паузу. Когда что-то случается, вы завершаете ответ соответствующими данными. Чтобы это сработало, я считаю, вам нужно написать свой собственный HTTP-сервер, который делает это специально, так как у вас не может быть 250 процессов php, зависающих в памяти. Возможно, Lighttpd можно как-то использовать таким образом с этим модом кеширования LUA. Я не знаю. Хотя было бы интересно. Черт, я должен попробовать это когда-нибудь :)

Чтобы это сработало, я считаю, вам нужно написать свой собственный HTTP-сервер, который делает это специально, так как у вас не может быть 250 процессов php, зависающих в памяти. Возможно, Lighttpd можно как-то использовать таким образом с этим модом кеширования LUA. Я не знаю. Хотя было бы интересно. Черт, я должен попробовать это когда-нибудь :)

Чтобы это сработало, я считаю, вам нужно написать свой собственный HTTP-сервер, который делает это специально, так как у вас не может быть 250 процессов php, зависающих в памяти. Возможно, Lighttpd можно как-то использовать таким образом с этим модом кеширования LUA. Я не знаю. Хотя было бы интересно. Черт, я должен попробовать это когда-нибудь :)

8
ответ дан 6 December 2019 в 11:52
поделиться

Конечно, есть, но я не думаю, что это будет очень эффективно для многих пользователей. Вы можете выполнить опрос, при котором каждый клиент опрашивает сервер, чтобы узнать, есть ли новые сообщения, или вы можете использовать метод кометы , в котором сервер может отправлять новые сообщения клиентам - ознакомьтесь с ] Плагин Comet для XAJAX . Я не понимаю, как это будет реализовано с использованием XAJAX и PHP, но вот как я бы попытался реализовать это.

Разрешите каждому клиенту подключиться к серверу (войти в систему и т. Д.), Затем:

  1. Для каждого сообщения, отправленного клиентом (отправителем), обновите очередь сообщений для клиента (получателя).
  2. Разрешить клиенту опрашивать сервер на наличие новых сообщений в очереди / Отправлять новые сообщения через комету.
  3. Обновить графический интерфейс, если он есть - новые сообщения.
  4. Промыть, вспенить, повторить

Использование настоящего сервера обмена мгновенными сообщениями, такого как ejabberd, может иметь большое значение, быть более эффективным и позволить вашим пользователям подключаться через настольных клиентов (если вы этого хотите). Я бы, вероятно, использовал это как бэкэнд, IOW ejabberd был бы сервером, а PHP был бы клиентом, использующим XMPP в PHP , и действовал бы как прокси для веб-интерфейса.

См. Также:
] Google Techtalk о функции чата Gmail (и проблемах масштабируемости)

Это мои 0,02 доллара

  • Обновите графический интерфейс при появлении новых сообщений.
  • Промойте, вспеньте, повторите
  • Использование настоящего сервера обмена мгновенными сообщениями, такого как ejabberd, может иметь большое значение, быть более эффективным и позволить вашим пользователям подключаться через настольные клиенты (если это то, что ты хочешь). Я бы, вероятно, использовал это как бэкэнд, IOW ejabberd был бы сервером, а PHP был бы клиентом, использующим XMPP в PHP , и действовал бы как прокси для веб-интерфейса.

    См. Также:
    ] Google Techtalk о функции чата Gmail (и проблемах масштабируемости)

    Это мои 0,02 доллара

  • Обновите графический интерфейс при появлении новых сообщений.
  • Промойте, вспеньте, повторите
  • Использование настоящего сервера обмена мгновенными сообщениями, такого как ejabberd, может иметь большое значение, быть более эффективным и позволить вашим пользователям подключаться через настольные клиенты (если это то, что ты хочешь). Я бы, вероятно, использовал это как бэкэнд, IOW ejabberd был бы сервером, а PHP был бы клиентом, использующим XMPP в PHP , и действовал бы как прокси для веб-интерфейса.

    См. Также:
    ] Google Techtalk о функции чата Gmail (и проблемах масштабируемости)

    Это мои 0,02 доллара

    6
    ответ дан 6 December 2019 в 11:52
    поделиться

    Компилятор должен быть достаточно умен, чтобы распознавать, что BigFoo не может быть преобразовано в IEnumerable , но это не так. Он просто видит, что это IEnumerable , и чувствует, что это потенциальный кандидат на перегрузку (даже несмотря на то, что ограничение, которое вы определили, заставляет T быть IFoo и int нельзя преобразовать в IFoo ). Хотя это неудобно, но это не так уж и важно. Просто приведите bigFoo к IFoo , и компилятор будет доволен:

    fooContainer.Add((IFoo)bigFoo);
    

    В качестве альтернативы, вы можете сделать свою общую перегрузку Add uglier:

    public void Add<T, U>(U group)
        where T : IFoo
        where U : IEnumerable<T>
    {
    }
    

    В любом случае, у вас больше ввода, второе решение устраняет необходимость для отправки вызовов на Добавить ,

    • использовать Flash Movie или Java апплет для выполнения некоторой связи через сокеты.
    • удерживать запросы опроса на стороне сервера на несколько секунд
    1
    ответ дан 6 December 2019 в 11:52
    поделиться

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

    На стороне сервера создайте сценарий " stall "на 60 секунд или до получения нового сообщения. При этом одно и то же соединение остается открытым в течение максимум 60 секунд, но при получении нового сообщения оно выводится и немедленно останавливается, предлагая клиентскому AJAX открыть другое соединение.

    Это обеспечивает почти мгновенное уведомление о новых сообщениях. и это намного проще для сервера, чем создание нового соединения каждые x секунд.

    0
    ответ дан 6 December 2019 в 11:52
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: