php只能作網站?基於swoole+websocket開發雙向通訊應用

前言

衆所周知,PHP用於開發基於HTTP協議的網站應用很是便捷。而HTTP協議是一種單向的通訊協議,只能接收客戶端的請求,而後響應請求,不能主動向客戶端推送信息。所以,一些實時性要求比較高的應用,如實時聊天、直播應用、在線網頁遊戲等,就不適合採用HTTP協議。即便採用客戶端主動輪詢的方式來間接實現雙向通訊,也會較大地增長服務器的負擔,增大代碼的複雜性,不利於維護。php

那麼,是否PHP就沒法用來開發雙向通訊的應用呢?html

答案是否認的。PHP內置socket通訊支持,能夠與linux程序基於socket進行雙向通訊。php swoole框架封裝了一個websocket服務端,基於此能夠很方便地創建一個與html5的websocket客戶端進行通訊的服務。前端

1、 Swoole介紹

Swoole是一個面向生產環境的 PHP 異步網絡通訊引擎,使 PHP 開發人員能夠編寫高性能的異步併發 TCP、UDP、Unix Socket、HTTP,WebSocket 服務。Swoole 能夠普遍應用於互聯網、移動通訊、企業軟件、雲計算、網絡遊戲、物聯網(IOT)、車聯網、智能家居等領域。 使用 PHP + Swoole 做爲網絡通訊框架,可使企業 IT 研發團隊的效率大大提高。html5

swoole支持用於搭建多種server,包括http server、websocket server、tcp server、redis server等等。這裏咱們使用到的是其中的websocket server。linux

2、WebSocket介紹

WebSocket是一種在單個TCP鏈接上進行全雙工通訊的協議。WebSocket通訊協議於2011年被IETF定爲標準RFC 6455,並由RFC7936補充規範。WebSocket API也被W3C定爲標準。 WebSocket使得客戶端和服務器之間的數據交換變得更加簡單,容許服務端主動向客戶端推送數據。在WebSocket API中,瀏覽器和服務器只須要完成一次握手,二者之間就直接能夠建立持久性的鏈接,並進行雙向數據傳輸。web

簡單地來講,websocket協議實現了瀏覽器和服務器之間的雙向通訊。而html5原生支持websocket協議。redis

3、swoole websocket 服務端demo

1.安裝swoole

swoole以php擴展的形式進行加載,首先須要爲你的php安裝swoole擴展,安裝命令以下:後端

pecl install swoole
複製代碼

安裝成功後在php.ini文件加上extension=swoole.so加載擴展瀏覽器

2.啓動服務端

新建一個php文件,文件名爲server.php,文件內容以下:bash

$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;//調用外部的server
    // $server->connections 遍歷全部websocket鏈接用戶的fd,給全部用戶推送
    foreach ($server->connections as $fd) {
        // 須要先判斷是不是正確的websocket鏈接,不然有可能會push失敗
        if ($server->isEstablished($fd)) {
            $server->push($fd, $request->get['message']);
        }
    }
});
$server->start();
複製代碼

此服務監聽本機的9501端口,運行命令 php server.php 啓動服務。

4、HTML5 WebSocket 客戶端demo

1.客戶端代碼

新建一個testServer.html文件,寫入如下內容:

<!doctype html>
<html>
<head>
   <title>測試WebSocket</title>
</head>

<body>
    <script>
        var ws = new WebSocket("ws://【服務端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>
複製代碼

將【服務端IP】替換成swoole服務端ip,保存文件。

5、測試demo

(1) 訪問步驟四的客戶端demo頁面,首先與服務端創建鏈接,查看瀏覽器console log,能夠看到顯示:

connected!

(2) 查看linux控制檯,能夠看到顯示:

server: handshake success with fd1

(3) 接着客戶端向服務端發了一條消息,服務端控制檯顯示:

receive from fd1:hello server,this is client!

(4) 服務端收到消息後,向客戶端回覆了一條消息,客戶端控制檯顯示:

server message:this is server

以上就是基於swoole+websocket開發雙向通訊應用的簡單演示,在線聊天、網頁遊戲等實時通訊的應用也可基於此方式進行開發。php開發效率高,能夠更快、更高效地進行此類應用地開發,節約開發成本。

你們若是還有什麼疑問,能夠關注公衆號「全棧社區」進行提問。


  • 關注微信公衆號「全棧社區」,可獲取更多站長、開發者必備的前端、後端、服務器技術乾貨。

  • 旭貓雲19元VPS:美國VPS

  • 旭貓雲免備案空間:香港雲主機

相關文章
相關標籤/搜索