Swooleに基づいてPHPとwebsocketのチャットルームを実現します。


websocket
Websocketはただのネットワーク通信プロトコルです。
httpやftpなどはネット通信のプロトコルです。多く考えないでください
HTTPのような非永続的プロトコルに対して、Websocketは永続的なネットワーク通信のプロトコルである。
WebSocketとHTTPの関係

交差点がありますが、全部ではありません。
WebsocketはHTTPの契約の一部を借りて握手をしただけです。HTTPの三回の握手はここで一回だけ行います。
httpとwebsocket要求ヘッドの対比:


HTTP:
元の時は、クライアントがhttp(乗馬)を通じて、手紙を持ってサーバーに要求し、サーバー処理要求(返信を書く)を行い、再度http(乗馬)を通じて戻ります。リンクが切断されました
WebSocket:
クライアントはhttp(乗馬)を通じて手紙要求サーバーを持っていますが、Upgrade:websocketConnection:Upgrade(2本の管)を携帯しています。サーバーがWebSocketプロトコル(2本のパイプのインターフェースがあります。)をサポートすれば、Websocketプロトコルを使って利用情報を返します。この後の情報の伝達はいずれもこの2つのパイプを使用しています。サーバがサポートされていない場合、クライアントからのリンク要求に失敗し、エラー情報を返します。
httpとwebsocketの応答ヘッダの比較:


websocketとajaxポーリング、long pollの違い
まずajaxポーリングです。ajaxポーリングの原理はとても簡単です。ブラウザに数秒おきに要求を送ります。サーバに新しい情報があるかどうか聞いてください。
シーン再生:
クライアント:ラララ、新しい情報がありますか?
サービス:ありません。
クライアント:ラララ、新しい情報がありますか?
サービス:ありません。Resonse)
クライアント:ラララ、新しい情報がありますか?
サービス:ご迷惑をおかけしました。ありませんでした。Resonse)
クライアント:ラララ、新しい情報がありますか?
サービス:はい、あります。どうぞ。Resonse)
クライアント:ラララ、新しい情報がありますか?
サービス:。いいえ、ありません。ありません。ありません
long pollの原理はajaxポーリングと同じです。ポーリングの方式を採用しています。
上から見れば、ポーリングとは、HTTP接続を絶えず確立し、その後、サービス端末処理を待つことで、HTTPプロトコルのもう一つの特徴、受動性を体現することができる。同時に、httpの毎回の要求と応答が終わったら、サーバはクライアント情報を全部廃棄します。次回の要求は、アイデンティティ情報(cookie)を携帯しなければなりません。
Websocketの出現、さっぱりとこれらの問題を解決しました。
上の状況は次のように修正できます。
クライアント:ラララ、Websocketプロトコルを作りたいです。必要なサービス:chat、Websocketプロトコルバージョン:17(HTTP Request)
サービス:ok、確認しました。すでにWebsocketプロトコルにアップグレードしました。(HTTP Protocols Switch ed)
お手数ですが、情報がある時は私に送ってください。
サービス:ok、時にはあなたに教えます。
クライアント:balabから斗図alabaalaを開始します。
サービス:苍井そらala
クライアント:鼻血が出ました。拭きます。
服務端:ハハブルは牛を教育します。強いです。ははははははは。
サービス:笑って死にます。ハハ。
Swoole
しかし、PHPを使ってHTML 5に協力してWebsocketの要求と応答を完成するために、兄は千山万水を歩いて、密林の深いところで、Swooleを発見しました。
PHP言語の非同期、並列、高性能ネットワーク通信フレームワークは、純粋なC言語で作成し、PHP言語の非同期マルチスレッドサーバ、非同期TCP/UDPネットワーククライアント、非同期MySQL、データベース接続プール、AyncTask、メッセージキュー、ミリ秒タイマー、非同期文読み書き、非同期DNSクエリを提供します。
サポートされているサービス:
Http Server
WebSocket Server
TCP Server
TCP Cient
Aync-InO(非同期)
Task(タイミングタスク)
環境依存度:
Linux,FreeBSD,MacOS,3種類のOSのみ対応しています。
Linuxカーネルバージョンは2.3.32以上です。
PHP 5.3.10以上のバージョン
gcc 4.4以上のバージョンまたはclang
cmake 2.4+,libs woole.soをC/C++ライブラリとしてコンパイルする場合はcmakeを使用する必要があります。
インストール:
システムには以下のようなソフトウェアがあることを保証しなければなりません。
php-5.30またはより高いバージョン
gcc-4.4またはより高いバージョン
メーク
atoot conf
SwooleはPHP拡張として動作します。
インストール(root権限):
cd swoole
phpize
./configure
メーク
sudo make install
プロファイルphp.ini
extension=swoole.so
Swooleを研究したいです。自分でマニュアルを見に行きます。
チャットルームを作ります
サーバー側:sockett.php

//  websocket     ,  0.0.0.0:9502  
$ws = new swoole_websocket_server("0.0.0.0", 9502);

//  WebSocket      
$ws->on('open', function ($ws, $request) {
  $fd[] = $request->fd;
  $GLOBALS['fd'][] = $fd;
  //$ws->push($request->fd, "hello, welcome
"); }); // WebSocket $ws->on('message', function ($ws, $frame) { $msg = 'from'.$frame->fd.":{$frame->data}
"; //var_dump($GLOBALS['fd']); //exit; foreach($GLOBALS['fd'] as $aa){ foreach($aa as $i){ $ws->push($i,$msg); } } // $ws->push($frame->fd, "server: {$frame->data}"); // $ws->push($frame->fd, "server: {$frame->data}"); }); // WebSocket $ws->on('close', function ($ws, $fd) { echo "client-{$fd} is closed
"; }); $ws->start();
クライアント:Sockett.

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<div id="msg"></div>
<input type="text" id="text">
<input type="submit" value="    " onclick="song()">
</body>
<script>
  var msg = document.getElementById("msg");
  var wsServer = 'ws://192.168.1.253:9502';
  //  websocket      :
  //  :ws/wss(  )://ip:port (   )
  var websocket = new WebSocket(wsServer);
  //onopen      
  websocket.onopen = function (evt) {
    //websocket.readyState   :
    /*
    CONNECTING  0  The connection is not yet open.
    OPEN  1  The connection is open and ready to communicate.
    CLOSING  2  The connection is in the process of closing.
    CLOSED  3  The connection is closed or couldn't be opened.
    */
    msg.innerHTML = websocket.readyState;
  };

  function song(){
    var text = document.getElementById('text').value;
    document.getElementById('text').value = '';
    //        
    websocket.send(text);
  }
   //      
//  websocket.onclose = function (evt) {
//    console.log("Disconnected");
//  };

  //onmessage          
  websocket.onmessage = function (evt) {
    msg.innerHTML += evt.data +'<br>';
//    console.log('Retrieved data from server: ' + evt.data);
  };
//        
//  websocket.onerror = function (evt, e) {
//    console.log('Error occured: ' + evt.data);
//  };

</script>
</html>
以上はSwooleに基づいてPHPとwebsocketのチャットルームのすべての内容を実現しました。本論文はPHPとwebsocketを勉強し、チャットルームを開発するのに役立つと信じています。