thenlabs/websocket-server

1.0.x-dev 2022-03-26 11:42 UTC

This package is auto-updated.

Last update: 2024-09-26 16:53:27 UTC


README

一个使用PHP编写的异步WebSocket服务器。

如果喜欢这个项目,请给我们一个⭐。

安装

$ composer require thenlabs/websocket-server 1.0.x-dev

该项目还没有稳定的版本。

用法

example目录中存在一个示例项目,该项目实现了一个裸聊服务器。

example/MyChatServer.php文件包含一个类,通过事件系统实现了服务器逻辑,如下所示。

<?php
// example/MyChatServer.php

use ThenLabs\WebSocketServer\Event\CloseEvent;
use ThenLabs\WebSocketServer\Event\MessageEvent;
use ThenLabs\WebSocketServer\Event\OpenEvent;
use ThenLabs\WebSocketServer\WebSocketServer;

class MyChatServer extends WebSocketServer
{
    protected $users = [];

    public function onOpen(OpenEvent $event): void
    {
        $request = $event->getRequest();
        $nickname = explode('/', $request->getRequestUri())[1];

        // notify to the connected users previously.
        foreach ($this->users as $user) {
            $user->send("User '{$nickname}' has connected.");
        }

        // add the new user to the list.
        $this->users[$nickname] = $event->getConnection();
    }

    public function onMessage(MessageEvent $event): void
    {
        $senderUser = $event->getConnection();
        $senderNick = array_search($senderUser, $this->users);

        $message = $event->getMessage();

        // send the message to the other users.
        foreach ($this->users as $user) {
            if ($user !== $senderUser) {
                $user->send("{$senderNick}: {$message}");
            }
        }
    }

    public function onClose(CloseEvent $event): void
    {
        $user = $event->getConnection();
        $nickname = array_search($user, $this->users);

        // notify to the other users.
        foreach ($this->users as $otherUser) {
            if ($otherUser !== $user) {
                $otherUser->send("The user {$nickname} has disconnected.");
            }
        }

        unset($this->users[$nickname]);
    }
}

example/start-server.php文件包含启动服务器的脚本。

<?php
// example/start-server.php

require_once __DIR__.'/../vendor/autoload.php';
require_once __DIR__.'/MyChatServer.php';

$config = [
    'host' => $argv[1] ?? '127.0.0.1',
    'port' => $argv[2] ?? 9090,
];

$server = new MyChatServer($config);
$server->start();

应该按照以下步骤执行此文件:

$ php example/start-server.php

为了测试示例,我们可以使用example/index.html文件,该文件包含三个客户端,可以使用如下所示:

开发

运行测试

启动selenium服务器。

$ java -jar path/to/selenium-server-standalone-x.y.z.jar

运行PyramidalTests

$ ./vendor/bin/pyramidal