基于Swoole實(shí)現(xiàn)PHP與websocket聊天室
websocket
Websocket只是一個(gè)網(wǎng)絡(luò)通信協(xié)議
就像 http、ftp等都是網(wǎng)絡(luò)通信的協(xié)議;不要多想;
相對(duì)于HTTP這種非持久的協(xié)議來(lái)說(shuō),Websocket是一個(gè)持久化網(wǎng)絡(luò)通信的協(xié)議;
WebSocket和HTTP的關(guān)系
有交集,但是并不是全部。
Websocket只是借用了HTTP的一部分協(xié)議來(lái)完成一次握手。(HTTP的三次握手,此處只完成一次)
http和websocket 請(qǐng)求頭對(duì)比:
HTTP:
原來(lái)的時(shí)候,客戶端通過(guò)http(騎馬)帶著信請(qǐng)求服務(wù)器,服務(wù)器處理請(qǐng)求(寫回信),再次通過(guò)http(騎馬)返回;鏈接斷開;
WebSocket:
客戶端通過(guò)http(騎馬)帶著信請(qǐng)求服務(wù)器,但同時(shí),攜帶了Upgrade:websocket
和Connection:Upgrade
(兩根管子),服務(wù)器如果支持WebSocket協(xié)議(有兩根管子的接口),使用Websocket協(xié)議返回可用信息(丟棄馬匹),此后信息的傳遞,均使用這兩個(gè)管子,除非有一方人為的將管子切斷;若服務(wù)器不支持,客戶端請(qǐng)求鏈接失敗,返回錯(cuò)誤信息;
http和websocket 響應(yīng)頭對(duì)比:
websocket和ajax輪詢、long poll的區(qū)別
首先是 ajax輪詢 ,ajax輪詢的原理非常簡(jiǎn)單,讓瀏覽器隔個(gè)幾秒就發(fā)送一次請(qǐng)求,詢問(wèn)服務(wù)器是否有新信息
場(chǎng)景再現(xiàn):
客戶端:啦啦啦,有沒有新信息(Request)
服務(wù)端:沒有(Response)
客戶端:啦啦啦,有沒有新信息(Request)
服務(wù)端:沒有。。(Response)
客戶端:啦啦啦,有沒有新信息(Request)
服務(wù)端:你好煩啊,沒有啊。。(Response)
客戶端:啦啦啦,有沒有新消息(Request)
服務(wù)端:好啦好啦,有啦給你。(Response)
客戶端:啦啦啦,有沒有新消息(Request)
服務(wù)端:。。。沒。。。。沒。。沒有
long poll 其實(shí)原理跟 ajax輪詢 差不多,都是采用輪詢的方式,不在論述;
從上面可以看出,輪詢其實(shí)就是在不斷地建立HTTP連接,然后等待服務(wù)端處理,可以體現(xiàn)HTTP協(xié)議的另外一個(gè)特點(diǎn),被動(dòng)性。同時(shí),http的每一次請(qǐng)求與響應(yīng)結(jié)束后,服務(wù)器將客戶端信息全部丟棄,下次請(qǐng)求,必須攜帶身份信息(cookie),無(wú)狀態(tài)性;
Websocket的出現(xiàn),干凈利落的解決了這些問(wèn)題;
所以上面的情景可以做如下修改。
客戶端:啦啦啦,我要建立Websocket協(xié)議,需要的服務(wù):chat,Websocket協(xié)議版本:17(HTTP Request)
服務(wù)端:ok,確認(rèn),已升級(jí)為Websocket協(xié)議(HTTP Protocols Switched)
客戶端:麻煩你有信息的時(shí)候推送給我噢。。
服務(wù)端:ok,有的時(shí)候會(huì)告訴你的。
客戶端:balab開始斗圖alabala
服務(wù)端:蒼井空ala
客戶端:流鼻血了,我擦……
服務(wù)端:哈哈布爾教育牛逼啊哈哈哈哈
服務(wù)端:笑死我了哈哈
Swoole
但是,為了用PHP配合HTML5完成一次WebSocket請(qǐng)求和響應(yīng),哥走過(guò)千山萬(wàn)水,在密林深處,發(fā)現(xiàn)了Swoole :
PHP語(yǔ)言的異步、并行、高性能網(wǎng)絡(luò)通信框架,使用純C語(yǔ)言編寫,提供了PHP語(yǔ)言的異步多線程服務(wù)器,異步TCP/UDP網(wǎng)絡(luò)客戶端,異步MySQL,數(shù)據(jù)庫(kù)連接池,AsyncTask,消息隊(duì)列,毫秒定時(shí)器,異步文件讀寫,異步DNS查詢。
支持的服務(wù):
HttpServer
WebSocket Server
TCP Server
TCP Client
Async-IO(異步)
Task(定時(shí)任務(wù))
環(huán)境依賴:
僅支持Linux,F(xiàn)reeBSD,MacOS,3類操作系統(tǒng)
Linux內(nèi)核版本2.3.32以上
PHP5.3.10以上版本
gcc4.4以上版本或者clang
cmake2.4+,編譯為libswoole.so作為C/C++庫(kù)時(shí)需要使用cmake
安裝:
必須保證系統(tǒng)中有以下這些軟件:
php-5.3.10 或更高版本
gcc-4.4 或更高版本
make
autoconf
Swoole是作為PHP擴(kuò)展來(lái)運(yùn)行的
安裝(root權(quán)限):
cd swoole
phpize
./configure
make
sudo make install
配置php.ini
extension=swoole.so
想研究Swoole的同學(xué),自己去看手冊(cè)(雖然寫的不好,但是還是能看懂的)
做一個(gè)聊天室
服務(wù)器端:socket.php
//創(chuàng)建websocket服務(wù)器對(duì)象,監(jiān)聽0.0.0.0:9502端口 $ws = new swoole_websocket_server("0.0.0.0", 9502); //監(jiān)聽WebSocket連接打開事件 $ws->on('open', function ($ws, $request) { $fd[] = $request->fd; $GLOBALS['fd'][] = $fd; //$ws->push($request->fd, "hello, welcome\n"); }); //監(jiā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}"); }); //監(jiān)聽WebSocket連接關(guān)閉事件 $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="發(fā)送數(shù)據(jù)" onclick="song()"> </body> <script> var msg = document.getElementById("msg"); var wsServer = 'ws://192.168.1.253:9502'; //調(diào)用websocket對(duì)象建立連接: //參數(shù):ws/wss(加密)://ip:port (字符串) var websocket = new WebSocket(wsServer); //onopen監(jiān)聽連接打開 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 = ''; //向服務(wù)器發(fā)送數(shù)據(jù) websocket.send(text); } //監(jiān)聽連接關(guān)閉 // websocket.onclose = function (evt) { // console.log("Disconnected"); // }; //onmessage 監(jiān)聽服務(wù)器數(shù)據(jù)推送 websocket.onmessage = function (evt) { msg.innerHTML += evt.data +'<br>'; // console.log('Retrieved data from server: ' + evt.data); }; //監(jiān)聽連接錯(cuò)誤信息 // websocket.onerror = function (evt, e) { // console.log('Error occured: ' + evt.data); // }; </script> </html>
以上就是基于Swoole實(shí)現(xiàn)PHP與websocket聊天室的全部?jī)?nèi)容,相信本文對(duì)大家學(xué)習(xí)PHP和websocket及開發(fā)聊天室很有幫助。
- php+websocket 實(shí)現(xiàn)的聊天室功能詳解
- php基于websocket搭建簡(jiǎn)易聊天室實(shí)踐
- php+html5基于websocket實(shí)現(xiàn)聊天室的方法
- php socket實(shí)現(xiàn)的聊天室代碼分享
- PHP實(shí)現(xiàn)簡(jiǎn)單聊天室(附源碼)
- 用PHP+MySQL搭建聊天室功能實(shí)例代碼
- php寫的簡(jiǎn)易聊天室代碼
- 基于HTTP長(zhǎng)連接的"服務(wù)器推"技術(shù)的php 簡(jiǎn)易聊天室
- 如何用PHP websocket實(shí)現(xiàn)網(wǎng)頁(yè)實(shí)時(shí)聊天
相關(guān)文章
TP5框架請(qǐng)求響應(yīng)參數(shù)實(shí)例分析
這篇文章主要介紹了TP5框架請(qǐng)求響應(yīng)參數(shù),結(jié)合實(shí)例形式分析了thinkPHP5請(qǐng)求參數(shù)及相應(yīng)參數(shù)的獲取方法,需要的朋友可以參考下2019-10-10thinkPHP5框架自定義驗(yàn)證器實(shí)現(xiàn)方法分析
這篇文章主要介紹了thinkPHP5框架自定義驗(yàn)證器實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了thinkPHP自定義驗(yàn)證器的具體定義與使用方法,需要的朋友可以參考下2018-06-06php web環(huán)境和命令行環(huán)境下查找php.ini的位置
這篇文章主要介紹了php web環(huán)境和命令行環(huán)境下如何查找php.ini的位置,需要的朋友可以參考下2019-07-07laravel5.5框架的上傳圖片功能實(shí)例分析【僅傳到服務(wù)器端】
這篇文章主要介紹了laravel5.5框架的上傳圖片功能,結(jié)合實(shí)例形式分析了laravel5.5框架將圖片上傳到服務(wù)器端的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2019-12-12thinkPHP基于ajax實(shí)現(xiàn)的菜單與分頁(yè)示例
這篇文章主要介紹了thinkPHP基于ajax實(shí)現(xiàn)的菜單與分頁(yè),結(jié)合實(shí)例形式分析了thinkPHP基于ajax無(wú)刷新交互實(shí)現(xiàn)菜單及分頁(yè)功能的相關(guān)技巧與注意事項(xiàng),需要的朋友可以參考下2016-07-07tp5使用layui實(shí)現(xiàn)多個(gè)圖片上傳(帶附件選擇)的方法實(shí)例
在以前項(xiàng)目中遇到有上傳圖片都是用 web Uploader插件上傳,因?yàn)槲椰F(xiàn)在項(xiàng)目都在使用 layui 所以今天趁著有時(shí)間寫一個(gè)tp5結(jié)合layui上傳圖片的示例,感興趣的可以了解一下2021-10-10關(guān)于Curl在Swoole協(xié)程中的解決方案詳析
這篇文章主要給大家介紹了關(guān)于Curl在Swoole協(xié)程中的解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Swoole具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09