眾所周知,PHP用于開(kāi)發(fā)基于HTTP協(xié)議的網(wǎng)站應(yīng)用非常便捷。而HTTP協(xié)議是一種單向的通信協(xié)議,只能接收客戶(hù)端的請(qǐng)求,然后響應(yīng)請(qǐng)求,不能主動(dòng)向客戶(hù)端推送信息。因此,一些實(shí)時(shí)性要求比較高的應(yīng)用,如實(shí)時(shí)聊天、直播應(yīng)用、在線(xiàn)網(wǎng)頁(yè)游戲等,就不適合采用HTTP協(xié)議。即使采用客戶(hù)端主動(dòng)輪詢(xún)的方式來(lái)間接實(shí)現(xiàn)雙向通信,也會(huì)較大地增加服務(wù)器的負(fù)擔(dān),增大代碼的復(fù)雜性,不利于維護(hù)。
雙向通信
那么,是否PHP就無(wú)法用來(lái)開(kāi)發(fā)雙向通信的應(yīng)用呢?
答案是否定的。PHP內(nèi)置socket通信支持,可以與linux程序基于socket進(jìn)行雙向通信。php swoole框架封裝了一個(gè)websocket服務(wù)端,基于此可以很方便地建立一個(gè)與html5的websocket客戶(hù)端進(jìn)行通信的服務(wù)。
一、 Swoole介紹swoole
Swoole是一個(gè)面向生產(chǎn)環(huán)境的 PHP 異步網(wǎng)絡(luò)通信引擎,使 PHP 開(kāi)發(fā)人員可以編寫(xiě)高性能的異步并發(fā) TCP、UDP、Unix Socket、HTTP,WebSocket 服務(wù)。Swoole 可以廣泛應(yīng)用于互聯(lián)網(wǎng)、移動(dòng)通信、企業(yè)軟件、云計(jì)算、網(wǎng)絡(luò)游戲、物聯(lián)網(wǎng)(IOT)、車(chē)聯(lián)網(wǎng)、智能家居等領(lǐng)域。 使用 PHP + Swoole 作為網(wǎng)絡(luò)通信框架,可以使企業(yè) IT 研發(fā)團(tuán)隊(duì)的效率大大提升。
swoole支持用于搭建多種server,包括http server、websocket server、tcp server、redis server等等。這里我們使用到的是其中的websocket server。
二、WebSocket介紹WebSocket
WebSocket是一種在單個(gè)TCP連接上進(jìn)行全雙工通信的協(xié)議。WebSocket通信協(xié)議于2011年被IETF定為標(biāo)準(zhǔn)RFC 6455,并由RFC7936補(bǔ)充規(guī)范。WebSocket API也被W3C定為標(biāo)準(zhǔn)。
WebSocket使得客戶(hù)端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡(jiǎn)單,允許服務(wù)端主動(dòng)向客戶(hù)端推送數(shù)據(jù)。在WebSocket API中,瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進(jìn)行雙向數(shù)據(jù)傳輸。
簡(jiǎn)單地來(lái)說(shuō),websocket協(xié)議實(shí)現(xiàn)了瀏覽器和服務(wù)器之間的雙向通信。而html5原生支持websocket協(xié)議。
三、swoole websocket 服務(wù)端demo1.安裝swoole
swoole以php擴(kuò)展的形式進(jìn)行加載,首先需要為你的php安裝swoole擴(kuò)展,安裝命令如下:
pecl install swoole安裝成功后在php.ini文件加上extension=swoole.so加載擴(kuò)展
2.啟動(dòng)服務(wù)端
新建一個(gè)php文件,文件名為server.php,文件內(nèi)容如下:
$server = new Swoole\WebSocket\Server("0.0.0.0", 9501);$server->on('open', function (Swoole\WebSocket\Server $server, $request) { echo "server: handshake success with fd{$request->fd}\n"; });$server->on('message', function (Swoole\WebSocket\Server $server, $frame) { echo "receive from {$frame->fd}:{$frame->data}\n"; $server->push($frame->fd, "this is server"); });$server->on('close', function ($ser, $fd) { echo "client {$fd} closed\n"; });$server->on('request', function (Swoole\Http\Request $request, Swoole\Http\Response $response) { global $server;//調(diào)用外部的server // $server->connections 遍歷所有websocket連接用戶(hù)的fd,給所有用戶(hù)推送 foreach ($server->connections as $fd) { // 需要先判斷是否是正確的websocket連接,否則有可能會(huì)push失敗 if ($server->isEstablished($fd)) { $server->push($fd, $request->get['message']); } }});$server->start();此服務(wù)監(jiān)聽(tīng)本機(jī)的9501端口,運(yùn)行命令 php server.php 啟動(dòng)服務(wù)。
四、HTML5 WebSocket 客戶(hù)端demo1.客戶(hù)端代碼
新建一個(gè)testServer.html文件,寫(xiě)入以下內(nèi)容:
<!doctype html><html><head> <title>測(cè)試WebSocket</title></head><body> <script> var ws = new WebSocket("ws://【服務(wù)端IP】:9501"); ws.onopen = function(event){ console.log("connected!"); ws.send("hello server,this is client!"); }; ws.onmessage= function(event){ console.log("server message:"+event.data); } ws.onclose = function(event){ console.log("closed!"); }; </script></body></html>將【服務(wù)端IP】替換成swoole服務(wù)端ip,保存文件。
五、測(cè)試demo(1) 訪(fǎng)問(wèn)步驟四的客戶(hù)端demo頁(yè)面,首先與服務(wù)端建立連接,查看瀏覽器console log,可以看到顯示:
connected!
(2) 查看linux控制臺(tái),可以看到顯示:
server: handshake success with fd1
(3) 接著客戶(hù)端向服務(wù)端發(fā)了一條消息,服務(wù)端控制臺(tái)顯示:
receive from fd1:hello server,this is client!
(4) 服務(wù)端收到消息后,向客戶(hù)端回復(fù)了一條消息,客戶(hù)端控制臺(tái)顯示:
server message:this is server
以上就是基于swoole+websocket開(kāi)發(fā)雙向通信應(yīng)用的簡(jiǎn)單演示,在線(xiàn)聊天、網(wǎng)頁(yè)游戲等實(shí)時(shí)通信的應(yīng)用也可基于此方式進(jìn)行開(kāi)發(fā)。php開(kāi)發(fā)效率高,可以更快、更高效地進(jìn)行此類(lèi)應(yīng)用地開(kāi)發(fā),節(jié)約開(kāi)發(fā)成本。
大家如果還有什么疑問(wèn),可以關(guān)注公眾號(hào)“全棧社區(qū)”進(jìn)行提問(wèn)。
關(guān)注微信公眾號(hào)“全棧社區(qū)”,可獲取更多站長(zhǎng)、開(kāi)發(fā)者必備的前端、后端、服務(wù)器技術(shù)干貨。旭貓?jiān)?9元VPS:xintu.xumaoyun.com掃描二維碼推送至手機(jī)訪(fǎng)問(wèn)。
版權(quán)聲明:本文由信途科技轉(zhuǎn)載于網(wǎng)絡(luò),如有侵權(quán)聯(lián)系站長(zhǎng)刪除。
轉(zhuǎn)載請(qǐng)注明出處http://www.quickersubmitter.com/xintu/15512.html