Lightweight multithreaded websocket server written in PHP

dev-master 2020-04-02 09:21 UTC

This package is auto-updated.

Last update: 2024-05-29 05:08:27 UTC


README

Build Status

Lightweight multithreaded websocket server written in PHP

Requirements

Example

Project tree

├── composer.json
└── src
    ├── MyListener.php
    └── run.php

composer.json:

{
  "require": {
    "frago9876543210/ws": "dev-master",
    "ext-json": "*"
  },
  "autoload": {
    "psr-4": {
      "app\\": "src/"
    }
  },
  "minimum-stability": "dev"
}

src/run.php:

<?php

declare(strict_types=1);

use app\MyListener;
use ws\utils\InternetAddress;
use ws\WebSocket;

require_once "vendor/autoload.php";

new WebSocket(new InternetAddress("0.0.0.0", 8080), "/ws", MyListener::class);

src/MyListener.php:

<?php

declare(strict_types=1);

namespace app;

use JsonException;
use Particle\Validator\Validator;
use ws\Connection;
use ws\EventListener;
use function json_decode;
use const JSON_THROW_ON_ERROR;

class MyListener implements EventListener{

	public function onConnect(Connection $connection) : void{
		echo "+ {$connection->getAddress()}\n";
	}

	public function onMessage(Connection $connection, string $message) : void{
		try{
			$data = json_decode($message, true, 2, JSON_THROW_ON_ERROR);

			$validator = new Validator();
			$validator->required("username")->string();
			$validator->required("message")->string();

			if($validator->validate($data)->isValid()){
				$connection->send($message, true);
				echo "{$data["username"]} ({$connection->getAddress()}): {$data["message"]}\n";
			}else{
				$connection->close("Invalid data provided");
			}
		}catch(JsonException $e){
			$connection->close("Failed to parse json: " . $e->getMessage());
		}
	}

	public function onDisconnect(Connection $connection) : void{
		echo "- {$connection->getAddress()}\n";
	}
}