基於Swoole實現PHP與websocket聊天室_php執行個體

來源:互聯網
上載者:User

websocket

Websocket只是一個網路通訊協定

就像 http、ftp等都是網路通訊的協議;不要多想;

相對於HTTP這種非持久的協議來說,Websocket是一個持久化網路通訊的協議;

WebSocket和HTTP的關係

有交集,但是並不是全部。

Websocket只是借用了HTTP的一部分協議來完成一次握手。(HTTP的三向交握,此處只完成一次)

http和websocket 要求標頭對比:


HTTP:

原來的時候,用戶端通過http(騎馬)帶著信請求伺服器,伺服器處理請求(寫回信),再次通過http(騎馬)返回;連結斷開;

WebSocket:

用戶端通過http(騎馬)帶著信請求伺服器,但同時,攜帶了Upgrade:websocketConnection:Upgrade(兩根管子),伺服器如果支援WebSocket協議(有兩根管子的介面),使用Websocket協議返回可用資訊(丟棄馬匹),此後資訊的傳遞,均使用這兩個管子,除非有一方人為的將管子切斷;若伺服器不支援,用戶端請求連結失敗,返回錯誤資訊;

http和websocket 回應標頭對比:


websocket和ajax輪詢、long poll的區別

首先是 ajax輪詢 ,ajax輪詢的原理非常簡單,讓瀏覽器隔個幾秒就發送一次請求,詢問伺服器是否有新資訊

情境再現:

用戶端:啦啦啦,有沒有新資訊(Request)

服務端:沒有(Response)

用戶端:啦啦啦,有沒有新資訊(Request)

服務端:沒有。。(Response)

用戶端:啦啦啦,有沒有新資訊(Request)

服務端:你好煩啊,沒有啊。。(Response)

用戶端:啦啦啦,有沒有新訊息(Request)

服務端:好啦好啦,有啦給你。(Response)

用戶端:啦啦啦,有沒有新訊息(Request)

服務端:。。。沒。。。。沒。。沒有

long poll 其實原理跟 ajax輪詢 差不多,都是採用輪詢的方式,不在論述;

從上面可以看出,輪詢其實就是在不斷地建立HTTP串連,然後等待服務端處理,可以體現HTTP協議的另外一個特點,被動性。同時,http的每一次請求與響應結束後,伺服器將用戶端資訊全部丟棄,下次請求,必須攜帶身份資訊(cookie),無狀態性

Websocket的出現,乾淨利落的解決了這些問題;

所以上面的情景可以做如下修改。

用戶端:啦啦啦,我要建立Websocket協議,需要的服務:chat,Websocket協議版本:17(HTTP Request)

服務端:ok,確認,已升級為Websocket協議(HTTP Protocols Switched)

用戶端:麻煩你有資訊的時候推送給我噢。。

服務端:ok,有的時候會告訴你的。

用戶端:balab開始鬥圖alabala

服務端:蒼井空ala

用戶端:流鼻血了,我擦……

服務端:哈哈布爾教育牛逼啊哈哈哈哈

服務端:笑死我了哈哈

Swoole

但是,為了用PHP配合HTML5完成一次WebSocket請求和響應,哥走過千山萬水,在密林深處,發現了Swoole :

PHP語言的非同步、並行、高效能網路通訊架構,使用純C語言編寫,提供了PHP語言的非同步多線程伺服器,非同步TCP/UDP網路用戶端,非同步MySQL,資料庫連接池,AsyncTask,訊息佇列,毫秒定時器,非同步檔案讀寫,非同步DNS查詢。

支援的服務:

HttpServer

WebSocket Server

TCP Server

TCP Client

Async-IO(非同步)

Task(定時任務)

環境依賴:

僅支援Linux,FreeBSD,MacOS,3類作業系統

Linux核心版本2.3.32以上

PHP5.3.10以上版本

gcc4.4以上版本或者clang

cmake2.4+,編譯為libswoole.so作為C/C++庫時需要使用cmake

安裝:

必須保證系統中有以下這些軟體:

php-5.3.10 或更高版本

gcc-4.4 或更高版本

make

autoconf

Swoole是作為PHP擴充來啟動並執行

安裝(root許可權):

cd swoole

phpize

./configure

make

sudo make install

配置php.ini

extension=swoole.so

想研究Swoole的同學,自己去看手冊(雖然寫的不好,但是還是能看懂的)

做一個聊天室

伺服器端:socket.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\n");});//監聽WebSocket訊息事件$ws->on('message', function ($ws, $frame) {  $msg = 'from'.$frame->fd.":{$frame->data}\n";//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\n";});$ws->start();

用戶端:Socket.html

<!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及開發聊天室很有協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.