首頁 >後端開發 >php教程 >利用PHP和Swoole實現即時通訊完全教程

利用PHP和Swoole實現即時通訊完全教程

WBOY
WBOY原創
2023-06-28 08:12:061127瀏覽

隨著網路和行動通訊技術的快速發展,即時通訊越來越受到人們的關注。即時通訊可以實現用戶之間的即時訊息傳遞、線上音視訊通話、遊戲對戰等功能,為網路應用帶來了更多可能性。

本文將介紹如何利用 PHP 和 Swoole 實作即時通信,從簡單的 WebSocket 應用開始,逐步介紹 Socket 程式設計的基礎知識和 Swoole 的應用實作。閱讀本文需要了解 PHP 基礎和網路程式設計的基本知識。

一、WebSocket 基礎

WebSocket 是一種基於 HTTP 協定的雙向通訊協議,它使用了一種被稱為「握手」的協定來啟用雙向通訊。 WebSocket 連線的優點是它的開銷非常小,通訊的即時性很好,可以在客戶端和伺服器之間建立雙向的即時通訊。

WebSocket 的建立需要經歷以下幾個步驟:

1.瀏覽器向伺服器發起WebSocket 握手請求,請求頭包含了一些關鍵字段,如Upgrade、Connection、Sec-WebSocket -Key 等。

2.伺服器處理用戶端的 WebSocket 要求,如果符合規範,則傳回回應封包,回應標頭中包含 Upgrade、Connection、Sec-WebSocket-Accept 等欄位。

3.客戶端收到伺服器的回應封包,校驗 Sec-WebSocket-Accept 字段,確認 WebSocket 握手成功建立。

4.雙方可以開始進行資料通信,可以發送文字、二進位、Ping、Pong 等訊息。

在 PHP 中使用 WebSocket,我們可以透過 Swoole 所提供的 WebSocket 服務來進行實作。以下介紹 Swoole 的基礎應用。

二、Swoole 基礎

1.安裝 Swoole

在開始使用 Swoole 之前,我們需要在伺服器上安裝 Swoole 擴充功能。可以透過以下指令來安裝:

pecl install swoole

或透過原始碼安裝:

$ wget https://github.com/swoole/swoole-src/archive /v4.3.3.tar.gz
$ tar zxvf v4.3.3.tar.gz
$ cd swoole-src-4.3.3
$ phpize
$ ./configure
$ make && make install --with-swoole

  1. Swoole WebSocket 服務

下面我們來實作一個簡單的WebSocket 服務,監聽9501 端口,當客戶端與伺服器建立連接時,向客戶端發送hello 訊息。

<?php

$server = new SwooleWebSocketServer("0.0.0.0", 9501);

$server->on('open', function (SwooleWebSocketServer $server, $request) {
    echo "new client connected
";
    $server->push($request->fd, "hello");
});

$server->on('message', function (SwooleWebSocketServer $server, $frame) {
    echo "received message: {$frame->data}
";
});

$server->start();

在該程式碼中,我們建立了一個新的 WebSocket 伺服器,並監聽了 9501 連接埠。當客戶端與伺服器建立連線時,會觸發 open 事件,向客戶端發送 hello 訊息。當客戶端向伺服器發送訊息時,會觸發 message 事件,我們可以透過 echo 輸出客戶端發送的訊息。

在啟動上面的程式碼後,我們可以使用瀏覽器或WebSocket 用戶端來連接該伺服器:

let ws = new WebSocket('ws://127.0.0.1:9501');
ws.onopen = function(event) {
    console.log('WebSocket connected');
};
ws.onmessage = function(event) {
    console.log('Received:', event.data);
};
ws.send('Hello, Server');

在客戶端成功連線後,控制台會輸出以下資訊:

WebSocket connected
Received: hello

表示客戶端已經成功接收到伺服器發送的hello 訊息。

三、實現即時聊天應用程式

下面,讓我們來實現一個即時聊天應用,允許多個用戶在一個聊天室內即時通訊。這需要我們繼續擴展上面的 WebSocket 伺服器,實現聊天室的基本功能。

<?php

$server = new SwooleWebSocketServer("0.0.0.0", 9501);

$server->set([
    'worker_num' => 2,    //启动2个Worker进程
]);

$server->on('open', function (SwooleWebSocketServer $server, $request) {
    echo "new client connected
";
    foreach($server->connections as $fd) {
        $server->push($fd, "{$request->fd} joined the room");
    }
});

$server->on('message', function (SwooleWebSocketServer $server, $frame) {
    foreach($server->connections as $fd) {
        if ($fd != $frame->fd) {
            $server->push($fd, "user {$frame->fd}: {$frame->data}");
        }
    }
});

$server->on('close', function ($server, $fd) {
    echo "client {$fd} closed
";
    foreach($server->connections as $fds) {
        $server->push($fds, "{$fd} quited the room");
    }
});

$server->start();

在上面的程式碼中,我們加入了 open 和 close 事件的處理。當有用戶連線或關閉連線時,會向其他連線的用戶發送加入或離開聊天室的訊息。當某個用戶在聊天室內發送訊息時,會將該訊息廣播給其他線上用戶。

在啟動上面的程式碼後,我們可以使用多個瀏覽器視窗分別連接伺服器,進入同一個聊天室。當某個用戶發送訊息時,其他的用戶可以即時接收到該訊息。

本文介紹如何利用 PHP 和 Swoole 實現即時通信,從基礎的 WebSocket 應用到即時聊天室應用。 Swoole 提供了更靈活的非同步程式設計方式,使得編寫高效能、高並發、低延時的應用變得更加容易。

以上是利用PHP和Swoole實現即時通訊完全教程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn