搜尋
首頁php框架ThinkPHP利用ThinkPHP6實現Websocket廣播

隨著現代web應用程式的不斷發展,即時通訊成為了必須的功能之一。而WebSocket 技術就是其中一種最受歡迎的即時通訊方式,能夠在伺服器和用戶端之間建立持久的雙向連接,實現即時通訊。

ThinkPHP 是一個非常流行的 PHP 框架,ThinkPHP 6 自帶了 Swoole 擴充包,使得在使用 WebSocket 技術時變得非常簡單。本文將介紹如何使用 ThinkPHP 6 框架來實作一個 WebSocket 廣播功能。

環境需求

在開始之前,需要準備以下環境:

  • PHP 7.2
  • Swoole 擴充功能
  • ##Composer
  • 基本的Web 開發知識
建立專案

首先,我們需要建立一個新的專案:

composer create-project topthink/think my-project

然後,為了方便使用WebSocket ,我們需要在專案的

composer.json 檔案中新增Swoole 擴充功能:

"require": {
    "topthink/think-swoole": "^2.0",
    "swoole/swoole": "^4.7"
}

完成後,執行下列指令進行安裝:

composer install

建立控制器

接下來,我們需要建立一個控制器來處理WebSocket 的請求。在

app/controller 目錄下建立一個名為Websocket.php 的文件,寫入以下程式碼:

<?php

declare(strict_types=1);

namespace appcontroller;

use thinkswooleWebsocket as SwooleWebsocket;
use SwooleWebSocketFrame;

class Websocket extends SwooleWebsocket
{
    /**
     * 监听连接事件
     * @param SwooleWebSocketServer $server
     * @param SwooleHttpRequest $request
     */
    public function onOpen($server, $request)
    {
    }

    /**
     * 监听接收消息事件
     * @param SwooleWebSocketServer $server
     * @param Frame $frame
     */
    public function onMessage($server, Frame $frame)
    {
    }

    /**
     * 监听关闭事件
     * @param SwooleWebSocketServer $server
     * @param int $fd
     */
    public function onClose($server, $fd)
    {
    }
}

在上面的程式碼中,我們繼承了

thinkswooleWebsocket 類,並重寫了其中的三個方法:

  • onOpen 方法用於監聽連接事件;
  • # onMessage 方法用於監聽接收訊息事件;
  • onClose 方法用於監聽關閉事件。
目前,這些方法並沒有做任何事情,接下來我們將會在這些方法中加入 WebSocket 通訊的邏輯。

註冊路由

在控制器建立好之後,我們需要在路由中進行註冊。在

app/route.php 檔案中加入以下內容:

use thinkacadeRoute;

Route::post('/ws', 'Websocket@onMessage')->middleware(    hinkmiddlewareAllowCrossDomain::class);

這裡使用了

Route::post 方法來註冊路由。這個路由的請求方式是 POST,路徑為 /ws,並將請求對應到了 Websocket 控制器的 onMessage 方法上。

編寫 WebSocket 通訊邏輯

現在,我們已經完成了 WebSocket 路由和控制器的建立與註冊。接下來,我們需要在控制器中新增 WebSocket 通訊的邏輯。我們將使用 Swoole 的 WebSocket 服務端來實作 WebSocket 通訊。

onOpen 方法中,我們可以取得客戶端的連接對象,並將其儲存起來,以便後續使用。在 onMessage 方法中,我們可以取得客戶端所傳送的訊息,並將這則訊息廣播給其它客戶端。在 onClose 方法中,我們需要將客戶端從連線池中移除。

app/controller 目錄下建立一個名為WebSocketServer.php 的文件,寫入以下程式碼:

<?php

declare(strict_types=1);

namespace appcontroller;

use SwooleHttpResponse;
use SwooleWebSocketFrame;
use SwooleWebSocketServer;
use thinkswoolewebsocketHandlerInterface;

class WebSocketServer implements HandlerInterface
{
    /**
     * @var array $connections
     */
    private $connections = [];

    /**
     * 监听连接事件
     * @param Server $server
     * @param SwooleHttpRequest $request
     */
    public function onOpen(Server $server, SwooleHttpRequest $request): void
    {
        $this->connections[$request->fd] = $request->fd;

        echo "client-{$request->fd} is connected
";
    }

    /**
     * 监听消息事件
     * @param Server $server
     * @param Frame $frame
     */
    public function onMessage(Server $server, Frame $frame): void
    {
        foreach ($this->connections as $fd) {
            $info = $server->getClientInfo((int)$fd);
            if ($info && isset($info['websocket_status']) && $info['websocket_status'] == WEBSOCKET_STATUS_FRAME) {
                $server->push($fd, $frame->data);
            } else {
                unset($this->connections[$fd]);
            }
        }

        echo "received message from client-{$frame->fd}: {$frame->data}
";
    }

    /**
     * 监听关闭事件
     * @param Server $server
     * @param int $fd
     * @param int $reactorId
     */
    public function onClose(Server $server, int $fd, int $reactorId): void
    {
        unset($this->connections[$fd]);

        echo "client-{$fd} is closed
";
    }

    /**
     * @param Response $response
     */
    public function onHandShake(Request $request, Response $response): bool
    {
        // Do nothing
        return true;
    }
}

設定WebSocket 服務

在寫入WebSocket 的服務程式碼之前,我們需要在

config 目錄下建立一個名為swoole.php 的設定文件,寫入以下內容:

return [
    'socket_type' => 'websocket',
    'host'        => '0.0.0.0',
    'port'        => 9501,
    'mode'        => SWOOLE_PROCESS,
    'sock_type'   => SWOOLE_SOCK_TCP,
    'settings' => [
        'worker_num' => swoole_cpu_num(),
    ],
    'handler' => ppcontrollerWebSocketServer::class,
];

在上面的程式碼中,我們透過設定檔告訴應用程式如何啟動Swoole WebSocket 服務。我們啟動

websocket socket 類型,綁定在 0.0.0.0:9501 上,並開啟了多進程模式,使用 TCP 協定。 worker_num 配置項目設定了伺服器的進程數,這裡使用了swoole_cpu_num() 用於返回系統CPU 數量;handler 配置項目指定了我們在上文中建立的WebSocketServer 類別。

執行 WebSocket 服務

在完成了建立、設定 WebSocket 服務的程式碼後,我們需要執行一下程式碼,來開啟 WebSocket 服務。在命令列中執行以下命令即可:

php think swoole start --mode=websocket

Websocket 服務已經啟動,你可以透過存取你的應用程式來測試它。你可以使用這個位址:

ws://your-domain:9501/ws。在瀏覽器中開啟多個選項卡,分別測試 WebSocket 的連線、訊息傳送和接收等功能。

小結

本文介紹如何使用 ThinkPHP 6 框架來實作一個 WebSocket 廣播功能。我們透過建立控制器、註冊路由和編寫 WebSocket 通訊邏輯,以及配置 WebSocket 服務,來完成這項功能。這個範例可以作為一個簡單 WebSocket 最佳實踐,為我們開發更高級的 WebSocket 功能提供了參考。

以上是利用ThinkPHP6實現Websocket廣播的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
ThinkPHP內置測試框架的關鍵功能是什麼?ThinkPHP內置測試框架的關鍵功能是什麼?Mar 18, 2025 pm 05:01 PM

本文討論了ThinkPHP的內置測試框架,突出了其關鍵功能(例如單元和集成測試),以及它如何通過早期的錯誤檢測和改進的代碼質量來增強應用程序可靠性。

如何使用ThinkPHP來構建實時股票市場數據源?如何使用ThinkPHP來構建實時股票市場數據源?Mar 18, 2025 pm 04:57 PM

文章討論了使用ThinkPHP進行實時股票市場數據提要,重點是設置,數據準確性,優化和安全措施。

在無服務器體系結構中使用ThinkPHP的關鍵注意事項是什麼?在無服務器體系結構中使用ThinkPHP的關鍵注意事項是什麼?Mar 18, 2025 pm 04:54 PM

本文討論了在無服務器體系結構中使用ThinkPHP的關鍵注意事項,專注於性能優化,無狀態設計和安全性。它突出了諸如成本效率和可擴展性之類的收益,但也應對挑戰

如何在ThinkPHP微服務中實現服務發現和負載平衡?如何在ThinkPHP微服務中實現服務發現和負載平衡?Mar 18, 2025 pm 04:51 PM

本文討論了在ThinkPHP微服務中實施服務發現和負載平衡,重點是設置,最佳實踐,集成方法和推薦工具。[159個字符]

ThinkPHP依賴性注入容器的高級功能是什麼?ThinkPHP依賴性注入容器的高級功能是什麼?Mar 18, 2025 pm 04:50 PM

ThinkPHP的IOC容器提供了高級功能,例如懶惰加載,上下文綁定和方法注入PHP App中有效依賴性管理的方法。Character計數:159

如何使用ThinkPHP來構建實時協作工具?如何使用ThinkPHP來構建實時協作工具?Mar 18, 2025 pm 04:49 PM

本文討論了使用ThinkPHP來構建實時協作工具,重點關注設置,Websocket集成和安全性最佳實踐。

使用ThinkPHP來構建SaaS應用程序的主要好處是什麼?使用ThinkPHP來構建SaaS應用程序的主要好處是什麼?Mar 18, 2025 pm 04:46 PM

ThinkPHP具有輕巧的設計,MVC架構和可擴展性。它通過各種功能提高可擴展性,加快開發並提高安全性。

如何使用ThinkPHP和RabbitMQ構建分佈式任務隊列系統?如何使用ThinkPHP和RabbitMQ構建分佈式任務隊列系統?Mar 18, 2025 pm 04:45 PM

本文概述了使用ThinkPhp和RabbitMQ構建分佈式任務隊列系統,重點是安裝,配置,任務管理和可擴展性。關鍵問題包括確保高可用性,避免常見的陷阱,例如不當

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用