首頁  >  文章  >  php框架  >  如何使用Swoole建立高效能的WebSocket伺服器

如何使用Swoole建立高效能的WebSocket伺服器

WBOY
WBOY原創
2023-06-13 23:59:201421瀏覽

近年來,WebSocket 技術在網路開發中越來越流行,尤其是在即時通訊、線上遊戲、推播訊息等領域。而 Swoole 作為一款高效能、非同步的 PHP 擴展,可以幫助開發者輕鬆建立高效能的 WebSocket 伺服器。本文將介紹如何使用 Swoole 建立一個高效能的 WebSocket 伺服器。

一、安裝 Swoole

Swoole 支援 PHP 5.3~7.4 版本,可透過 pecl 或原始碼安裝。以下以原始碼安裝為例:

首先下載的Swoole 安裝包,然後解壓縮進入目錄,執行下列指令:

phpize
./configure
make
make install

安裝完成後,在php.ini 中加入下列設定項啟用Swoole 擴充功能:

extension=swoole

安裝完成後,使用php --ri swoole 指令可以查詢Swoole 的基本資訊。

二、建立 WebSocket 伺服器

下面我們來建立一個簡單的 WebSocket 伺服器。首先在專案根目錄下建立一個 server.php 文件,輸入以下程式碼:

<?php
$server = new swoole_websocket_server("0.0.0.0", 9502);

$server->on("open", function (swoole_websocket_server $server, swoole_http_request $request) {
    echo "client {$request->fd} connected
";
});

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

$server->on("close", function (swoole_websocket_server $server, $fd) {
    echo "client {$fd} closed
";
});

$server->start();

以上程式碼中,我們先建立了一個 swoole_websocket_server 實例,設定監聽位址為 0.0.0.0,連接埠為 9502。接著分別監聽了 ​​open、message、close 三個事件,在客戶端連線建立、接收到訊息、連線關閉時分別觸發對應的事件處理函數。

接下來在控制台執行以下指令啟動WebSocket 伺服器:

php server.php

如果一切正常,可以看到類似下列輸出:

2019-06-17 10:51:17|INFO|Server Start: 0.0.0.0:9502

三、測試WebSocket 伺服器

啟動WebSocket 伺服器後,可以使用前端開發者常用的WebSocket 外掛工具,例如Firefox 的Simple WebSocket Client 外掛程式或Chrome 的WebSocket Client 外掛程式測試伺服器是否正常運作。

以 Firefox Simple WebSocket Client 為例,開啟外掛程式後輸入 ws://127.0.0.1:9502 點選 Connect 按鈕即可。這時候我們會發現,在伺服器端控制台輸出了輸出了 "client 1 connected" 日誌,這表示 WebSocket 用戶端已經成功連接了伺服器。

我們可以在插件的傳送區域輸入測試內容,例如輸入"hello" 然後點擊send 按鈕,就可以在控制台看到對應的"received message: hello" 日誌,說明伺服器已經成功接收了WebSocket 用戶端所傳送的訊息。

四、提高效能

在大流量場景下,WebSocket 伺服器的效能是非常關鍵的。 Swoole 提供了多種機制來提高 WebSocket 伺服器的效能。

  1. 開啟協程

透過在程式碼中呼叫SwooleCoroutineun 函數開啟協程,可以讓多個協程並發執行,提高伺服器的吞吐量。

例如,修改server.php 中的程式碼:

<?php
use SwooleCoroutine;
Coun(function () {
    $server = new swoole_websocket_server("0.0.0.0", 9502);

    $server->on("open", function (swoole_websocket_server $server, swoole_http_request $request) {
        echo "client {$request->fd} connected
";
    });

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

    $server->on("close", function (swoole_websocket_server $server, $fd) {
        echo "client {$fd} closed
";
    });

    $server->start();
});
  1. 設定worker 數量

在啟動伺服器的時候,可以透過設定worker 數量來提高伺服器的並發處理能力。可以透過以下方式設定 worker 個數:

$server->set([
    'worker_num' => 4,   // 工作进程数量
]);

在協程下,需要在 run 函數內才能設定 worker 數量。

  1. 使用非同步MySQL

如果WebSocket 伺服器需要操作資料庫,可以使用Swoole 的非同步MySQL 用戶端,可以避免因為資料庫操作導致的阻塞,從而提高伺服器效能。

例如,使用 Swoole 非同步 MySQL 用戶端取得一筆記錄的範例程式碼如下:

$db = new SwooleCoroutineMySQL();
$db->connect([
    'host' => 'localhost',
    'port' => 3306,
    'user' => 'root',
    'password' => '',
    'database' => 'test',
]);

$res = $db->query('SELECT * FROM users WHERE id = 1');

以上就是如何使用 Swoole 建立高效能的 WebSocket 伺服器的基本流程。透過使用 Swoole 提供的非同步支援、多進程、協程等優勢,可以大幅提高 WebSocket 伺服器的效能,使應用程式更加穩定且有效率。

以上是如何使用Swoole建立高效能的WebSocket伺服器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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