ホームページ > バックエンド開発 > PHPチュートリアル > PHPサーバープッシュテクノロジーチャットルーム

PHPサーバープッシュテクノロジーチャットルーム

WBOY
リリース: 2016-07-25 08:57:32
オリジナル
921 人が閲覧しました
  1. //chat.php
  2. header('cache-control: private');
  3. header('Content-Type: text/html; charset=utf-8');
  4. ?> ;
复制代

保存用户提交聊天内容 简易版本:

  1. $content = trim($_POST['content']);
  2. if ($content) {
  3. $fp = fopen('./chat.txt', 'a') ;
  4. fwrite($fp, $content . "n");
  5. fclose($fp);
  6. clearstatcache();
  7. }
  8. ?>
复正代

主要なHTTP长接続部分、chat_content。 php文件:

  1. header('cache-control: private');

  2. header('Content-Type: text/html; charset=utf-8');
  3. //
  4. set_time_limit(30);
  5. //この一行は IE のこの BT を確認するためです
  6. echo str_repeat(' ', 256);

  7. ob_flush();

  8. flush();

  9. $fp = new SplFileObject('./chat.txt', 'r+');

  10. $line = 0;
  11. $totalLine = 0;
  12. while (!$fp->eof()) {
  13. $fp->current();
  14. $totalLine++;
  15. $fp->next();
  16. }

  17. $fp->seek($totalLine);

  18. $i = $totalLine - 1;
  19. while (true) {
  20. if (!$fp->eof()) {
  21. if ($content = trim($fp) ->current())) {
  22. echo '
    ';
  23. echo htmlspecialchars($content);
  24. echo "
";
  • flush();
  • $fp->next() ;
  • $i++;
  • }
  • } else {
  • $fp->seek($i - 1);
  • $fp->next();
  • }
  • {
  • //这里可以追加心跳检测後退出循環环
  • }
  • usleep(1000);
  • }
  • ?>

  • 复制代码

    コードの説明: 06. タイムアウトを設定します。長時間の HTTP 接続を維持する必要があるため、この時間はおそらく数時間ほど長くなる必要があります。また、上記の記事では、閲覧デバイスの制限により、これらの長い HTTP 接続は 2 つしか開くことができないと説明されています。 。加えて 実際には、タイムアウトなしを設定した場合でも、サーバー部分 (Apache など) の設定ファイルによって HTTP リクエストの最大待ち時間が設定される場合もあるため、一般的にはデフォルトで考えられているような効果が得られない可能性があります。 15分タイムアウト。もし 興味があれば、自分で変更してみることもできます。

    09. ここに空白のセクションが出力されていますが、これは主にマニュアルで IE ブラウザが最初の 256 文字を直接出力しないと説明されているため、最初に空白を何気なく出力して以降の内容を出力できるようにし、おそらく他のブラウザには他のブラウザもあります ブラウザの設定については、PHPマニュアルのfrush関数の説明を確認してください。次の 11 行と 12 行は、これらの空白文字をブラウザに強制的に出力させるためのものです。

    13. ~ 20. ここでの主な目的は、この行の終わりから内容を読み取ることができるようにファイルの行数を計算することです。

    以下のwhileループは、ファイルの最後に到達したかどうかを毎回判定して出力するループで、現在の検出は間違いありません。それ以外の場合は、その行が読み取られて出力されます。 針は 1 行前進して循環を続け、毎回 1000 マイクロ秒待機します。

    39. 長時間の接続が維持される場合、クライアントが切断されても、サーバーはクライアントが切断されたことを認識できない可能性があるため、各ユーザーがハートビート フラグを保持する、各グリッドの更新など、ここでいくつかのハートビート レコードが必要になる場合があります。数秒以内に 最終ハートビート時刻が長期間更新されていない場合、この無限ループが開始され、HTTP 接続が閉じられます。

    デモの例 2: 従来の B/S 構造アプリケーションはすべて「クライアント プル」を使用して、クライアントとサーバー間のデータ交換を実現します。 この記事では、Ticks を組み合わせてサーバープッシュ型の PHP チャット ルームのシンプルなアイデアを実装します。

    PHPer、特に set_cookie, header を使用したことのある人は、次のプロンプト メッセージを目にしたことがあるはずです: 「警告: ヘッダー情報を変更できません - ヘッダーはすでに... によって送信されています。」 これは、通信が HTTP プロトコルを介して行われるためです。 、データ パケットには 2 つの部分が含まれ、1 つはヘッダー、もう 1 つはデータです。 一般的に、ヘッダー部分が最初に開始され、データ部分の長さがヘッダー部分で指定され、次に \r\n\r\n を使用してヘッダー部分の終わりを示し、その後にデータ部分が続きます。 。

    何か出力がある場合は、ヘッダー部分が送信されます。このとき、ヘッダー関数を使用してヘッダー部分のドメイン情報を変更すると、上記のプロンプト情報が得られます。 簡単な解決策は、output_buffering を使用することです。サーバーの出力をキャッシュし、ヘッダー部分をクライアントにあまり早く送信しないようにします。 それでは、output_buffering が使用されない場合、サーバーが出力するたびに、それがすぐにクライアントに送信されるようにすることはできるのでしょうか? 次の実験を行ってください。

    1. //php.iniでoutput_buffering=0を設定するか、ob_end_flush()を使用してキャッシュをオフにします
    2. set_time_limit(0)
    3. for($i=0;$i<10;$ i++) {
    4. echo "Now Index is :".
    5. sleep(1)
    6. ?>
    スクリプトが完了するまでまだ待つ必要があることがわかりました。すべての結果を一度に確認する前に実行されます。なぜ? これは、キャッシュの問題を解決するだけでなく、PHP がプログラムの出力をバッファリングするというバッファリングの問題も解決するためです。 したがって、PHP にすべてのプログラム出力をクライアントに送信させるために、この時点で flash() を呼び出す必要があります。

    //php.iniでoutput_buffering=0を設定します

  • ob_end_flush();//キャッシュをオフにします

  • set_time_limit(0);

  • for($i=0;$i echo "現在インデックスは :"
  • flash();
  • }
  • ?> ;
  • コードをコピー
  • サーバーのデータが常に表示されているのを見たことがありますか?
  • いくつかの概念の間には関係があるので、ここに追加します。 コード内で ob_start() を使用することは、サーバー キャッシュを使用して、php.ini で Output_buffering=on を使用することと同じです。 コード内で ob_end_flush() を使用することは、php.ini で Output_buffering = false を使用してサーバー キャッシュをオフにすることと同じです。 1
    2 次のページ 最後のページ

    ソース:php.cn
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート