Несколько посетителей подключаются к http://site.com/chat.php
Каждый из них может писать и отправлять текстовое сообщение в chat.php, и он мгновенно отображается в браузере каждого пользователя ( http://site.com/chat.php )
Должен ли я использовать базу данных? Я имею в виду, достаточно ли возможностей AJAX или PHP-буфера для такого чата на сеансах?
Как сеансы разных пользователей могут обмениваться данными друг с другом?
Любая идея или идеи будут оценены, спасибо!
Изменить: Спасибо за ссылки. Но то, что я хочу, – это способ передачи данных в клиентский браузер. Постоянно обновляется клиентский браузер (AJAX или нет) единственным способом? Также здесь возникает проблема, как разные пользователи, например, 2, 1 на 1, обмениваются текстами чата? Как вы их храните? И как вы синхронизируете тексты между двумя клиентами? Не использовать базу данных предпочтительно.
Редактировать 2: На самом деле YShout, упомянутый Peter D, выполняет эту работу очень хорошо. Кажется, что он не обновляет браузер. Но я не понимаю, как он подталкивает новые сообщения к существующему окну пользователя.
есть (примерно) 3 варианта создания приложения чата:
используйте flash / java и сокеты для интерфейса и язык программирования, поддерживающий сокет для бэкэнд. для бэкэнд я бы рекомендовал java или python, потому что они многопотоки и NIO-совместимые. это можно сделать с помощью PHP (но php не может эффективно выполнять многопоточность и, как правило, не подходит для этого). это вариант, если вам нужна высокая производительность и, вероятно, не то, что вы ищете.
в этом случае все клиенты постоянно (например, каждые 2 секунды) проводят опрос, если что-то новое произошло. это кажется странным, потому что вы получаете ответы только на этих интервалах. Кроме того, это создает серьезную нагрузку на ваш сервер и пропускную способность. вы знаете, что приложение использует эту технику, потому что браузер постоянно обновляется. это субоптимальное решение.
это работает с многочастными ответами и имеет длинные (php-) скрипты в бэкэнд. не лучшее решение, но в большинстве случаев это лучше, чем потянуть, и оно работает и используется в нескольких известных чат-приложениях. этот метод иногда называют COMET .
мой совет: если вам нужно приложение для чата для производственного использования, установите существующий. программировать чат-приложения не так- то просто.
если вы просто хотите изучить его, начните с простого приложения ajax / pull, а затем попробуйте запрограммировать его с помощью ajax и push.
и да, скорее всего, вам понадобится база данных, я очень успешно реализовал очень простое решение ajax / pull, которое работает с текстовыми файлами для удовольствия (но я, конечно, не использовал бы его в производстве!).
это (насколько мне известно, но я уверен) невозможно создать чат-приложение без серверной бэкэнд (только с одним интерфейсом javascript)!
если вы хотите узнать, как выполняется нажатие данных, посмотрите на источник здесь: http://wehrlos.strain.at/httpreq/client.html . async multipart – это то, что вы хотите 🙂
function asSendSyncMulti() { var httpReq = new XMLHttpRequest(); showMessage( 'Sending Sync Multipart ' + (++this.reqCount) ); // Sync - wait until data arrives httpReq.multipart = true; httpReq.open( 'GET', 'server.php?multipart=true&c=' + (this.reqCount), false ); httpReq.onload = showReq; httpReq.send( null ); } function showReq( event ) { if ( event.target.readyState == 4 ) { showMessage( 'Data arrives: ' + event.target.responseText ); } else { alert( 'an error occured: ' + event.target.readyState ); } }
showReq вызывается каждый раз, когда данные поступают, а не только один раз, как в обычных ajax-запросах (я не использую jquery или прототип здесь, поэтому код немного тучный – это действительно старый :)).
вот часть серверной части:
<?php $c = $_GET[ 'c' ]; header('Content-type: multipart/x-mixed-replace;boundary="rn9012"'); sleep( 1 ); print "--rn9012\n"; print "Content-type: application/xml\n\n"; print "\n"; print "Multipart: First Part of Request " . $c . "\n"; print "--rn9012\n"; flush(); sleep( 3 ); print "Content-type: application/xml\n\n"; print "\n"; print "Multipart: Second Part of Request " . $c . "\n"; print "--rn9012--\n"; ?>
в отношении базы данных: если в бэкэнд вы используете ничего-общую архитектуру, такую как mod_php / cgi, вам нужно какое- то внешнее хранилище, например базы данных или текстовые файлы. но: вы можете положиться на память, написав свой собственный http-сервер (возможно с php, но я бы не рекомендовал его для серьезной работы). это не очень сложно, но, вероятно, немного выходит за рамки вашего вопроса ^^
Я допустил ошибку! все перепуталось, потому что я долгое время делал что-то подобное. вот поправки:
multipart-ответы работают только с браузерами Mozilla и поэтому имеют ограниченное использование. COMET не означает многочастный ответ.
COMET означает: традиционный однострочный ответ, но удерживаемый (с бесконечным циклом и сном), пока не будут доступны данные. поэтому браузер имеет 1 запрос / ответ для каждого действия (в худшем случае), а не один запрос каждые х секунд, даже если ничего не заслуживает ответа.
Вы упомянули, что хотите, чтобы это работало без БД, и без того, чтобы клиент (ы) опросил сервер для обновлений.
Теоретически вы можете сделать это, сохранив «журнал» чатов в текстовом файле на сервере и изменив свою страницу, чтобы пользователь выполнил запрос GET на странице chat.php, но страница PHP никогда не заканчивает отправку назад для пользователя. (например, ответ никогда не завершается)
Вам нужно будет отправить данные « нет », чтобы поддерживать связь, когда нет сообщений, но теоретически это сработает.
Проблема в том, что для выполнения вышеизложенного все еще много работы. Вам нужно будет отправлять сообщения AJAX обратно на сервер, чтобы отправлять новые комментарии … браузер пользователей будет вращаться все время (если вы не вложите журнал чата в iframe – например, больше работы) … и такого рода установки просто будет очень трудно управлять.
Я бы предложил захватить бесплатный скрипт чата из другого места (например, http://tinychat.com/ ), или если вы хотите перевернуть свой собственный (для удовольствия / опыта), тогда вперед, но начните с БД и создайте страницу, будет выталкивать сообщения с сервера.
Наконец, если вас беспокоит «забивание» сервера с помощью запросов AJAX … нет. Просто создайте чат, затем, если вы обнаружите проблемы с производительностью, вернитесь в StackOverflow с вопросом о том, как оптимизировать его, чтобы сотни запросов не наводняли чат, когда нет активности.
В то время как HTTP не предназначен для легкого нажатия, вы можете эмулировать push-соединение, поскольку PHP-скрипт никогда не заканчивается, и результат JavaScript будет тщательно отслеживаться.
По сути, вы имитируете считыватель потоков.
Если вы хотите, чтобы новые пользователи загружали историю чата, которая произошла до того, как они вошли в комнату, требуется БД или другое хранилище. Если вы не пытаетесь создать чат для обучения, есть слишком много возможностей для свободного использования.
http://tinychat.com – еще один простой чат-сайт.
AJAX отлично работает. Я создал простую страницу для одного из моих сайтов. Но я считаю, что чат не привыкает так часто, как вы думаете.
Совместное использование данных становится немного более сложным и будет проще выполнить, разместив IRC-сервер и разрешив пользователям использовать IRC-клиенты, обладающие возможностями обмена данными. Хотя ничто не останавливает вас от загрузки одного пользователя на сайт, а затем других. Человеку было бы сложно использовать веб-интерфейс, потому что пользователи никоим образом не связаны друг с другом.
и он мгновенно отображается в браузере каждого пользователя.
С помощью php / JS вы не можете передавать данные с сервера на клиентов. Поэтому ваши клиенты должны запрашивать данные с сервера. И это то, что описал суннифф в своем посте.
Вы можете сделать это полностью с помощью HTML и Javascript, используя службу PubNub . Вам не нужна база данных, так как вы могли бы использовать что-то вроде истории api для заполнения последних сообщений чата x.
Вот краткое руководство по созданию чат-приложения с PubNub.
Enter Chat and press enter <div><input id=input placeholder=you-chat-here /></div> Chat Output <div id=box></div>
<script src=http://cdn.pubnub.com/pubnub.min.js></script> <script>(function(){ var box = PUBNUB.$('box'), input = PUBNUB.$('input'), channel = 'chat'; PUBNUB.subscribe({ channel : channel, callback : function(text) { box.innerHTML = (''+text).replace( /[<>]/g, '' ) + '<br>' + box.innerHTML } }); PUBNUB.bind( 'keyup', input, function(e) { (e.keyCode || e.charCode) === 13 && PUBNUB.publish({ channel : channel, message : input.value, x : (input.value='') }) } ) })()</script>