2

PHPページでSSEを使い始めたところです。このコードを使用すると、新しいデータを非常に簡単に送信できます。

while(true) {
    if (isset($_GET["selectedName"]) && $_GET["selectedName"] != "empty") {
        echo "data:current timestamp for user ".$_GET["selectedName"]." is ".time().PHP_EOL;
        echo PHP_EOL;
        ob_flush();
        flush();
    }
    sleep(1);
}

ただし、これは、クライアントに毎秒データを送信しているため、ループを実行する必要があることを意味します。例の文字列はあまりデータではありません。しかし、後でデータベースに接続して、そこからデータを取得したいと思います。

記事全体(またはメッセージなど)のようなものをプルすると、非常に大量のデータが生成されます。

今私の質問:新しいデータを提供し、別のPHPスクリプトからクライアントに送信するようにスクリプトに指示するにはどうすればよいですか?

小さなAPIを使用してステータスの更新をサーバーに送信する小さなiOSアプリを作成しました。APIスクリプトの1つで、新しいデータを送信するようにWebインターフェイスのイベントソーススクリプトに指示したいと思います。

そして、私がそうするように言うときだけ。どうすればこれを達成できますか?

助けてくれてありがとう、ジュリアン

4

1 に答える 1

2

一度に送信するものがあまりないという事実(0から4までの状態番号と小さなメッセージ文字列)に関して、変数を設定して、何かが変更されたかどうかを確認することにしました。

static $oldStateString;

while(true) {
    $result = mysql_query("SELECT * FROM st_workers");
    $currentStateString = "";

    while ($user = mysql_fetch_array($result)) {
        $currentStateString .= $user["stateIndex"].":--;".$user["state"].":--;".$user["humanReadableName"].":__;";
    }

    if ($currentStateString != $oldStateString) {
        echo "data:".$currentStateString.PHP_EOL;
        echo PHP_EOL;
        ob_flush();
        flush();

        $oldStateString = $currentStateString;
    }
    sleep(1);
}

しかし、イベントハンドラーを開始する必要があるのは、ではなく、少し後であることに気付きました<body onload="">。これにより、Safari6と現在のFireFoxを除くほとんどのブラウザでエラーが発生します。ブラウザは、ロードされていないことを認識しません。そのため、「ローディングスピナー」は5分以上経過するまで停止しません。

于 2012-09-19T11:43:20.350 に答える