0

私は、クライアント側のインスタンスが他のクライアント側のインスタンスが何かを投稿したことを検出して、その投稿を取得できるようにしようとしています。(だからチャットシステムのようなものだと思いますが、私の実装ではそれを意図したものではありません)

サーバー サイド イベントを使用しようとしています。

クライアントの Javascript が着信サーバー PHP 出力をリッスンする基本的な SSE 構造を使用すると、数秒ごとにメッセージの連続ストリームが得られることに気付きました。

ユーザー インスタンスに (HTML フォームを介して) データをサーバー PHP スクリプトに POST させるにはどうすればよいですか。PHP スクリプトはデータを受信して​​ SSE スタイルの JSON に変換し、それを出力 (エコー) してから、すべてのユーザー インスタンスにそれを検出して取得させます。 1回の投稿で1回だけ?

たとえば、これは私の基本的な SSE 構造です。

POST データを受信し、JSON データを出力する PHP スクリプト (stream.php)

    header('Content-Type: text/event-stream');
    header('Cache-Control: no-cache');

    function sendMsg($name, $msg) {
      echo "data: {\n";
      echo "data: \"name\": \"$name\", \n";
      echo "data: \"msg\": \"$msg\", \n";
      echo "data: \"id\": 1\n";
      echo "data: }\n";
      echo PHP_EOL;
      ob_flush();
      flush();
    }

    sendMsg($_POST['name'], $_POST['message']);

サーバー送信データをリッスンして受信するためのクライアント側 Javascript (index.php 内)

var source = new EventSource('stream.php');
        }               

        source.addEventListener('message', function(e) {
            var data = JSON.parse(e.data);
            $("#stream").prepend(
                "<div class='newitem'>" +
                data.name + ": " + data.msg + 
                "</div>"
            )
        }, false);

そして、の下では、私がすべきように、3 秒ごとに 1 つ<div id="stream">の連続ストリームを取得します。undefinedこのような:

undefined undefined
undefined undefined
undefined undefined
....

では、次のようなフォームを作成し、上記のストリームで送信されたデータを検出して表示するにはどうすればよいでしょうか?

サーバーにデータを送信する HTML フォーム (index.php 内)

<form action="stream.php" method="POST">
    <input name="name" id="name" type="text"/>

    <textarea id="message" name="message"></textarea>
    <br>
    <input name="submit" id="submit" type="submit" value="Send"/>    
</form>

うまくいけば、私のストリームは次の<div id="stream">ようになりますか?

undefined undefined
Bob: Hello
undefined undefined
....

現在、実際にはstream.phpがフォームデータを取得しているのに、なぜか表示されません。未定義のまま読み続けます (というか、何も表示しません)。

これを達成できれば、undefined undefinedメッセージをフィルターで除外して、定義されたメッセージのみがクライアント側のストリームに表示されるようにする予定です。

4

1 に答える 1