Как создать скрипт чата с помощью PHP?[закрыто]

StackOverflow https://stackoverflow.com/questions/772471

  •  12-09-2019
  •  | 
  •  

Вопрос

Несколько посетителей подключаются к http://site.com/chat.php

Каждый из них может написать и отправить текстовое сообщение на chat.php и оно мгновенно отображается в браузере каждого пользователя (http://site.com/chat.php)

Должен ли я использовать базу данных?Я имею в виду, достаточно ли возможностей буфера AJAX или PHP для такой комнаты чата на сеансах?

Как сеансы разных пользователей могут обмениваться данными друг с другом?

Любая идея или озарения будут оценены по достоинству, спасибо!

Редактировать:Спасибо за ссылки.Но то, что я хочу, - это способ передавать данные в клиентский браузер.Является ли постоянное обновление клиентского браузера (AJAX или нет) единственным способом?Также проблема здесь заключается в том, как разные пользователи, например, 2, 1 на 1, обмениваются текстами в чате?Как вы их храните?И как вы синхронизируете тексты между двумя клиентами?Предпочтительно не использовать базу данных.

Правка 2:На самом деле Йшут упомянутый Питером Ди делает эту работу довольно хорошо.Похоже, он не постоянно обновляет браузер.Но я не понимаю, как это помещает новые сообщения в окно существующего пользователя.

Это было полезно?

Решение

существует (примерно) 3 варианта создания приложения для чата:

розетки

используйте flash / java и сокеты для интерфейса и язык программирования с поддержкой сокетов для серверной части.в качестве серверной части я бы порекомендовал java или python, потому что они являются многопоточными и поддерживают NIO.это возможно сделать с помощью PHP (но php на самом деле не может выполнять эффективную многопоточность и, как правило, не очень подходит для этого).это вариант, если вам нужна высокая производительность, и, вероятно, это не то, что вы ищете.

используйте ajax и тяните

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

используйте ajax и нажимайте

это работает с составными ответами и имеет давно запущенные (php-) скрипты в серверной части.не самое лучшее решение, но в большинстве случаев это лучше, чем вытягивать, и оно работает и используется в нескольких хорошо известных приложениях для чата.этот прием иногда называют КОМЕТА.

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

если вы просто хотите изучить это, начните с простого приложения ajax / pull, затем попробуйте запрограммировать его с помощью ajax и push.

и да, скорее всего, вам понадобится база данных, но я успешно внедрил очень простое решение ajax / pull, которое работает с текстовыми файлами для развлечения (но я, конечно, не стал бы использовать его в производстве!).

насколько мне известно, но я почти уверен, что невозможно создать приложение для чата без серверного бэкэнда (используя только внешний интерфейс javascript)!

Обновить

если вы хотите знать, как происходит передача данных, посмотрите на источник здесь: http://wehrlos.strain.at/httpreq/client.html.асинхронная составная часть - это то, что вам нужно :)

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 или prototype, поэтому код немного перегружен - он действительно старый :)).

вот часть на стороне сервера:

<?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";

?>

обновление 2

что касается базы данных:если у вас есть архитектура без общего доступа, такая как mod_php / cgi в серверной части, вы определенно потребность некоторые вид внешнего хранилища, например базы данных или текстовые файлы.но:вы могли бы положиться на память, написав свой собственный http-сервер (возможно, с помощью php, но я бы не рекомендовал его для серьезной работы).это на самом деле не сложно, но, вероятно, немного выходит за рамки вашего вопроса ^^

обновление 3

я совершил ошибку!все перепуталось, потому что прошло много времени, когда я действительно делал что-то подобное.вот исправления:

  1. составные ответы работают только с браузерами mozilla и поэтому имеют ограниченное применение.КОМЕТА не означает многокомпонентный ответ.

  2. КОМЕТА означает:традиционный односоставный ответ, но удерживается (с бесконечным циклом и переходом в спящий режим) до тех пор, пока не будут доступны данные.таким образом, браузер имеет 1 запрос / ответ на каждое действие (в худшем случае), а не по одному запросу каждые x секунд, даже если ничего, заслуживающего ответа, не происходит.

Другие советы

Вы упоминаете, что хотите, чтобы это работало без базы данных и без того, чтобы клиент (ы) опрашивал сервер на предмет обновлений.

Теоретически вы можете сделать это, сохранив "журнал" чатов в текстовом файле на сервере и изменив свою страницу таким образом, чтобы пользователь выполнял запрос 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, используя такой сервис, как ПабНуб.Вам не понадобится база данных, так как вы могли бы использовать что-то вроде история api чтобы заполнить последние x сообщений чата.

Вот краткое руководство по созданию приложения для чата с помощью PubNub.

Приложения для чата в реальном времени в 10 строках кода

enter image description here

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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top