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 つのクライアント間でテキストを同期するにはどうすればよいでしょうか?できればデータベースは使用しないこと。

編集2:実は Yシャウト Peter D が言及したものは、この仕事を非常にうまく行っています。ブラウザを更新し続けないようです。しかし、新しいメッセージを既存のユーザーのウィンドウにプッシュする方法がわかりません。

役に立ちましたか?

解決

チャット アプリケーションを作成するには (大まかに) 3 つのオプションがあります。

ソケット

フロントエンドにはフラッシュ/Java とソケットを使用し、バックエンドにはソケット対応プログラミング言語を使用します。バックエンドには、マルチスレッドと NIO 対応の Java または Python をお勧めします。PHP を使用してそれを行うことは可能です (ただし、php は効率的なマルチスレッド処理を実際には実行できず、一般にこれにはあまり適していません)。これは、高いパフォーマンスが必要な場合のオプションですが、おそらくあなたが探しているものではありません。

ajaxを使用してプルする

この場合、すべてのクライアントは、何か新しいことが起こったかどうかを常に (たとえば 2 秒ごとに) ポーリングします。その間隔でしか応答が得られないので、奇妙に感じます。さらに、サーバーと帯域幅にかなりの負担がかかります。ブラウザは常に更新されるため、アプリケーションがこの手法を使用していることがわかります。これは次善の解決策です。

ajaxを使用してプッシュする

これはマルチパート応答で動作し、バックエンドで長時間実行される (p​​hp-) スクリプトを持ちます。最良の解決策ではありませんが、ほとんどの場合、プルするよりも優れており、機能し、いくつかの有名なチャット アプリで使用されています。このテクニックは時々呼ばれます 彗星.

私のアドバイス:本番環境で使用するチャット アプリが必要な場合は、既存のチャット アプリをインストールしてください。チャットアプリケーションのプログラミングはそうではありません それ 簡単。

それを学びたいだけの場合は、単純な ajax/プル アプリから始めて、次に ajax とプッシュを使用してプログラムしてみてください。

そしてはい、おそらくデータベースが必要になるでしょう。難しいですが、私は趣味でテキストファイルを扱う非常に単純な 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 リクエストのように 1 回だけではなく到着します (ここでは 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";

?>

アップデート2

データベースに関して:バックエンドに mod_php/cgi のような何も共有されていないアーキテクチャがある場合、 間違いなく 必要 いくつかの データベースやテキストファイルなどの外部ストレージの一種。しかし:独自の http サーバーを作成することでメモリに頼ることもできます (php では可能ですが、本格的な作業にはお勧めしません)。それはそれほど複雑ではありませんが、おそらく質問の範囲から少し外れます^^

アップデート3

私が間違えました!実際にそのようなことをしたのは本当に久しぶりだったので、すべてが混同されています。修正点は次のとおりです。

  1. マルチパート応答は Mozilla ブラウザでのみ機能するため、用途は限られています。COMET はマルチパート応答を意味するものではありません。

  2. コメットとは次のことを意味します。従来の単一部分の応答ですが、データが利用可能になるまで保持されます (無限ループとスリープを使用)。したがって、ブラウザーは、応答に値するものが何も起こらなかったとしても、x 秒ごとに 1 つのリクエストではなく、アクションごとに 1 つのリクエスト/レスポンスを持ちます (最悪の場合)。

他のヒント

あなたは、これはDB、およびクライアントなし(複数可)をポーリングすることなく、更新のためにサーバーを仕事にしたい言及ます。

理論的には、あなたは決して実際には、サーバー上のテキストファイル内のチャットで「ログ」、およびユーザーがchat.phpページでGETリクエストを行うように、あなたのページを変更しますが、PHPのページに格納することにより、これを行うことができますユーザーに返送終了。 (例えば、レスポンスが完了することはありません)。

あなたはそこにはメッセージがありませんが、理論的には、これはうまくいく時に行くの接続を維持するために、いくつかの「の無opはの」データを返送する必要があります。

問題は、上記のは、まだ多くの作業で達成するために、です。あなたは、ユーザーのブラウザが全体の時間を回転することでしょう...新しいコメントを提出するよう、サーバーに戻ってAJAXの投稿を行う必要があります(しない限り、あなたの巣のiframe内チャットログ - など多くの作業)...と、この種セットアップのちょうど管理するのは非常に難しいだろう。

私は他の場所からの無料チャットのスクリプトをつかむことをお勧めしたい(例: http://tinychat.com/する)あなたは(楽しい/経験のために)独自のロールしたい場合や、その後先に行くが、DBを開始し、サーバからメッセージをプッシュとプルするページを構築します。

あなたはAJAX要求でサーバーを「ハンマー」を心配している最後にあれば...ありません。ただ、活動がないとき、何百もの要求がチャットをフラッディングされないように、それを最適化する方法についての質問でStackOverflowのに戻って、あなたはパフォーマンスの問題がある見つけた場合、その後、チャットを構築します。

HTTPは、簡単にはプッシュのために作られていないが、

は、あなたが慎重に監視されるPHPスクリプトが終了しなくなると、JavaScriptの結果によってプッシュ接続をエミュレートすることができます。

基本的に、あなたは、ストリームリーダーをシミュレートしています。

あなたは、彼らが部屋に入る前に発生したチャットの歴史をロードするための新しいユーザーを希望の場合は、

、DBまたはその他のストレージが必要です。あなたが学習のためのチャットを作成しようとしている場合を除き、気にして自由のために使用するそこにあまりにも多くがあります。

http://tinychat.com の別の簡単なチャットサイトです。

AJAXが正常に動作します。私は自分のサイトのいずれかの単純なページを作成しました。しかし、私はそのチャットはできるだけ頻繁にあなたが思うだろうとして慣れていない見つけます。

データの共有が少し複雑になりますし、IRCサーバをホストし、ユーザーがデータ交換機能を持つIRCクライアントを使用できるようにすることで達成することが容易になります。何がサイトにあるユーザーのアップロードを持っていることからあなたを停止されていないが、その後、他の人がダウンロードしてください。ユーザーがお互いにどのような方法で接続されていないので、人によっては、Webインターフェイスを使用したとは困難であろう。

  

と、それはみんなのブラウザ上で瞬時に表示します。

PHP / JSを使用すると、サーバからクライアントにデータをプッシュすることはできません。だからあなたのクライアントは、サーバからのデータを依頼する必要があります。そして、それはscunliffeは彼のポストで説明したものです。

あなたは、HTMLとJavascriptが PubNub のようなサービスを利用して、完全にこれを行うことができます。あなたは履歴APIのようなものを使用することができますように、データベースを必要としません最後のxチャットメッセージを移入するを。

ここでPubNubとのチャットアプリを構築する上で簡単なチュートリアルです。

コードの10行で

リアルタイムチャットアプリ

ここに画像の説明を入力します

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