首頁  >  文章  >  php框架  >  Workerman開發:如何實作WebSocket伺服器

Workerman開發:如何實作WebSocket伺服器

WBOY
WBOY原創
2023-11-07 15:29:011383瀏覽

Workerman開發:如何實作WebSocket伺服器

如何使用Workerman實現WebSocket伺服器

隨著WebRTC技術、遊戲即時通訊、線上聊天等應用的日益普及,WebSocket技術也變得越來越重要。而Workerman則是運行在PHP環境下的高效能的非同步TCP、UDP、Unix Socket網路框架,它天生支援高並發,非常適合用來開發WebSocket伺服器。

本篇文章將詳細介紹如何使用Workerman實現WebSocket伺服器,包括如何處理WebSocket連接、如何發送和接收WebSocket訊息以及如何進行框架與其他程式庫的整合等方面。文章的最後也提供了一個完整的範例程式碼。

  1. 安裝Workerman

在開始使用Workerman之前,需要先安裝它。可以透過Composer進行安裝,也可以直接從GitHub下載原始碼並手動安裝。這裡我們以Composer安裝為例:

composer require workerman/workerman
  1. 編寫WebSocket伺服器程式碼

在使用Workerman實作WebSocket伺服器之前,需要先了解WebSocket協定的工作原理。 WebSocket是一種全雙工、長連接的協議,客戶端和伺服器之間透過握手建立連接,之後可以互相傳送訊息。 WebSocket訊息可以是文字、二進位甚至是檔案等任意數據,伺服器可以根據訊息類型進行不同的處理。

使用Workerman實作WebSocket伺服器非常簡單,只需要幾行程式碼即可完成。以下是範例:

require_once __DIR__ . '/vendor/autoload.php';
use WorkermanWorker;

// 创建一个Worker监听8090端口,使用websocket协议通讯
$wsWorker = new Worker("websocket://0.0.0.0:8090");

// 启动4个进程对外提供服务
$wsWorker->count = 4;

// 处理WebSocket连接的回调函数
$wsWorker->onConnect = function($connection) {
    echo "New connection
";
};

// 处理WebSocket消息的回调函数
$wsWorker->onMessage = function($connection, $data) {
    // 处理消息...
};

// 启动Worker
Worker::runAll();

首先,我們建立一個Worker實例,並指定它監聽埠8090,使用websocket協定通訊。然後設定啟動4個進程,用於處理大量並發連線。 Worker支援TCP、UDP、Unix Socket等多種傳輸協議,因此我們需要指定WebSocket協定。

在這個範例中,我們只定義了兩個回呼函數:

  1. 當有新的WebSocket連線建立時,onConnect回呼函數將會被調用,我們可以在這裡記錄日誌、統計線上使用者等操作。
  2. 當收到WebSocket訊息時,onMessage回呼函數將被調用,我們需要在這裡處理訊息,例如進行簡單的計算、發送回應等操作。
  3. 最後一步是啟動Worker,它將開始監聽指定連接埠並處理WebSocket連線和訊息。
  4. WebSocket訊息的處理

透過onMessage回呼函數,我們可以接收到客戶端發送的WebSocket訊息,資料格式可以是文字或二進位。處理WebSocket訊息的方式取決於應用程式場景,例如線上聊天應用程式可能需要實現廣播、點對點聊天等功能,而遊戲應用需要實現微秒級的即時通訊。

下面是一個簡單範例,它可以將接收到的訊息列印出來並回覆給客戶端:

$wsWorker->onMessage = function($connection, $data) {
    echo "Received message: {$data}
";
    $connection->send("Received: {$data}");
};

WebSocket連線的狀態

在WebSocket連線建立後,客戶端和伺服器之間的連線會保持開啟。透過onClose回呼函數,我們可以處理連接斷開的事件:

$wsWorker->onClose = function($connection) {
    echo "Connection closed
";
};
  1. 整合框架

Workerman可以非常方便地與其他框架整合。這裡我們以Laravel框架為例,介紹如何在Laravel使用Workerman實作WebSocket伺服器。

首先,我們需要在Laravel專案中安裝Workerman:

composer require workerman/workerman

接下來,我們可以建立一個自訂Artisan指令來啟動WebSocket伺服器:

php artisan make:command WebSocketServer

然後在app /Console/Commands/WebSocketServer.php檔案中編寫程式碼:

<?php

namespace AppConsoleCommands;

use IlluminateConsoleCommand;
use WorkermanWorker;

class WebSocketServer extends Command {
    // 命令名称
    protected $name = 'websocket:server';

    // 命令描述
    protected $description = 'Start WebSocket server';

    // 执行命令
    public function handle() {
        // 创建Worker实例,监听8080端口
        $wsWorker = new Worker("websocket://0.0.0.0:8080");

        // 进程数量
        $wsWorker->count = 4;

        // 处理连接事件
        $wsWorker->onConnect = function($connection) {
            echo "New connection
";
        };

        // 处理消息事件
        $wsWorker->onMessage = function($connection, $data) {
            // 处理消息
        };

        // 运行Worker
        Worker::runAll();
    }
}

最後,我們可以透過以下指令來啟動WebSocket伺服器:

php artisan websocket:server

可以看到,使用Workerman實作WebSocket伺服器非常簡單,並且可以輕鬆整合到其他框架中。

  1. 完整程式碼範例

以下是一個完整的WebSocket伺服器範例,它可以接收客戶端發送來的訊息並進行簡單的處理,並將處理結果回复給客戶端:

count = 4;

// 处理WebSocket连接的回调函数
$wsWorker->onConnect = function($connection) {
    echo "New connection
";
};

// 处理WebSocket消息的回调函数
$wsWorker->onMessage = function($connection, $data) {
    echo "Received message: {$data}
";
    $result = "Received: {$data}";
    $connection->send($result);
};

// 处理连接断开事件的回调函数
$wsWorker->onClose = function($connection) {
    echo "Connection closed
";
};

// 启动Worker
Worker::runAll();

以上就是使用Workerman實現WebSocket伺服器的全部內容,透過這篇文章的介紹,相信讀者們已經掌握了相關的技術知識,同時也可以在實際專案中使用這些技巧進行開發了。

以上是Workerman開發:如何實作WebSocket伺服器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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