Rumah  >  Artikel  >  rangka kerja php  >  Melaksanakan siaran Websocket menggunakan ThinkPHP6

Melaksanakan siaran Websocket menggunakan ThinkPHP6

WBOY
WBOYasal
2023-06-20 08:41:341637semak imbas

Dengan pembangunan berterusan aplikasi web moden, komunikasi masa nyata telah menjadi salah satu fungsi yang diperlukan. Teknologi WebSocket ialah salah satu kaedah komunikasi masa nyata yang paling popular, yang boleh mewujudkan sambungan dua hala yang berterusan antara pelayan dan pelanggan untuk mencapai komunikasi masa nyata.

ThinkPHP ialah rangka kerja PHP yang sangat popular ThinkPHP 6 disertakan dengan pakej sambungan Swoole, menjadikannya sangat mudah untuk menggunakan teknologi WebSocket. Artikel ini akan memperkenalkan cara menggunakan rangka kerja ThinkPHP 6 untuk melaksanakan fungsi siaran WebSocket.

Keperluan alam sekitar

Sebelum bermula, anda perlu menyediakan persekitaran berikut:

  • PHP 7.2+
  • Sambungan Swoole
  • Komposer
  • Pengetahuan Pembangunan Web Asas

Buat Projek

Pertama, kita perlu mencipta projek baharu:

rreee

Kemudian, untuk memudahkan daripada menggunakan WebSocket, kita perlu menambah sambungan Swoole dalam fail composer.json projek:

composer create-project topthink/think my-project

Selepas selesai, jalankan arahan berikut untuk memasang:

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

Buat pengawal

Seterusnya, kita perlu mencipta pengawal untuk mengendalikan permintaan WebSocket. Cipta fail bernama app/controller dalam direktori Websocket.php dan tulis kod berikut:

composer install

Dalam kod di atas, kami mewarisi kelas thinkswooleWebsocket dan menulis semula tiga daripadanya Kaedah:

  • digunakan untuk memantau peristiwa sambungan; kaedah onOpen
  • digunakan untuk memantau peristiwa menerima mesej; . onMessage
  • Pada masa ini, kaedah ini tidak melakukan apa-apa Seterusnya, kami akan menambah logik komunikasi WebSocket kepada kaedah ini. onClose
  • Daftar laluan

Selepas pengawal dibuat, kita perlu mendaftarkannya dalam laluan. Tambahkan kandungan berikut dalam fail

:

<?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)
    {
    }
}

Kaedah

digunakan di sini untuk mendaftarkan laluan. Kaedah permintaan laluan ini ialah app/route.php, laluannya ialah

dan permintaan dipetakan kepada kaedah

pengawal Route::post. POST/wsMenulis logik komunikasi WebSocketWebsocketonMessageKini, kami telah menyelesaikan penciptaan dan pendaftaran laluan dan pengawal WebSocket. Seterusnya, kita perlu menambah logik untuk komunikasi WebSocket dalam pengawal. Kami akan menggunakan pelayan WebSocket Swoole untuk melaksanakan komunikasi WebSocket.

Dalam kaedah

, kita boleh mendapatkan objek sambungan pelanggan dan menyimpannya untuk kegunaan seterusnya. Dalam kaedah

, kita boleh mendapatkan mesej yang dihantar oleh pelanggan dan menyiarkan mesej ini kepada pelanggan lain. Dalam kaedah

, kita perlu mengalih keluar klien daripada kumpulan sambungan.

onOpenBuat fail bernama onMessage dalam direktori onClose dan tulis kod berikut:

use thinkacadeRoute;

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

Konfigurasikan perkhidmatan WebSocket app/controllerWebSocketServer.phpTulis kod perkhidmatan WebSocket Sebelum ini, kami memerlukan untuk mencipta fail konfigurasi bernama

dalam direktori

dan tulis kandungan berikut:

<?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;
    }
}

Dalam kod di atas, kami memberitahu aplikasi bagaimana untuk memulakan Swoole WebSocket melalui fail konfigurasi Serve. Kami memulakan jenis soket config, mengikatnya pada swoole.php dan mendayakan mod berbilang proses, menggunakan protokol TCP. Item konfigurasi

menetapkan bilangan proses pada pelayan

digunakan di sini untuk mengembalikan bilangan CPU sistem websocket item konfigurasi menentukan kelas 0.0.0.0:9501 yang kami buat di atas. worker_numswoole_cpu_num()Jalankan perkhidmatan WebSocket handlerWebSocketServerSelepas melengkapkan kod untuk mencipta dan mengkonfigurasi perkhidmatan WebSocket, kami perlu menjalankan kod untuk memulakan perkhidmatan WebSocket. Cuma laksanakan arahan berikut pada baris arahan:

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,
];

Perkhidmatan Websocket telah dimulakan dan anda boleh mengujinya dengan mengakses aplikasi anda. Anda boleh menggunakan alamat ini:

. Buka berbilang tab dalam penyemak imbas untuk menguji sambungan WebSocket, fungsi penghantaran dan penerimaan mesej masing-masing.

Ringkasan

ws://your-domain:9501/wsArtikel ini memperkenalkan cara menggunakan rangka kerja ThinkPHP 6 untuk melaksanakan fungsi siaran WebSocket. Kami mencapai ini dengan mencipta pengawal, mendaftarkan laluan dan menulis logik komunikasi WebSocket, dan mengkonfigurasi perkhidmatan WebSocket. Contoh ini boleh digunakan sebagai amalan terbaik WebSocket yang mudah dan menyediakan rujukan untuk kami membangunkan fungsi WebSocket yang lebih maju.

Atas ialah kandungan terperinci Melaksanakan siaran Websocket menggunakan ThinkPHP6. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn