Skip to content

An useful library for creating asynchronous network applications with PHP.

License

Notifications You must be signed in to change notification settings

thenlabs/socket-server

Folders and files

NameName
Last commit message
Last commit date

Latest commit

3a85ae6 · Apr 19, 2022

History

19 Commits
Apr 19, 2022
Oct 23, 2021
Oct 9, 2021
Oct 9, 2021
Oct 11, 2021
Oct 9, 2021
Oct 21, 2021
Oct 11, 2021
Mar 14, 2022
Mar 14, 2022
Oct 11, 2021
Oct 9, 2021

Repository files navigation

SocketServer

An useful library for creating asynchronous network applications with PHP.

If you like this project gift us a ⭐.

Features.

  • Asynchronous connections.
  • Multiple configuration options.
  • Event system to implement the application logic.
  • Logs support.

Installation.

$ composer require thenlabs/socket-server

Usage.

The below code show a bare network application that accept multiple connections and forward each incoming message to the rest of the connections.

That application can be found in the tests/Functional/hub.php file. For test it you can run php tests/Functional/hub.php.

Can be seen that the SocketServer class offers the necessary events for react at the differents connection status.

Check the SocketServer API for knows all his possibilities.

<?php
/**
 * What this program does is accept multiple connections and forward
 * each incoming message to the rest of the connections.
 */

require_once __DIR__.'/../../bootstrap.php';

use ThenLabs\SocketServer\Event\ConnectionEvent;
use ThenLabs\SocketServer\Event\DataEvent;
use ThenLabs\SocketServer\Event\DisconnectionEvent;
use ThenLabs\SocketServer\SocketServer;

class HubServer extends SocketServer
{
    protected $connections = [];

    public function onConnection(ConnectionEvent $event): void
    {
        foreach ($this->connections as $connection) {
            $connection->writeLine("New connection.");
        }

        $this->connections[] = $event->getConnection();
    }

    public function onData(DataEvent $event): void
    {
        $data = $event->getData();

        switch ($data) {
            case 'exit':
                $event->getConnection()->close();
                break;

            case 'stop':
                $event->getServer()->stop();
                break;

            default:
                foreach ($this->connections as $connection) {
                    if ($connection != $event->getConnection()) {
                        $connection->writeLine($data);
                    }
                }
                break;
        }
    }

    public function onDisconnection(DisconnectionEvent $event): void
    {
        foreach ($this->connections as $id => $connection) {
            if ($connection == $event->getConnection()) {
                unset($this->connections[$id]);
                break;
            }
        }
    }
}

$server = new HubServer(['socket' => $argv[1] ?? 'tcp://127.0.0.1:9000']);
$server->start();

The above example works as follows:

Development.

Running the tests.

For run the tests, runs the next command:

$ ./vendor/bin/pyramidal