thenlabs / socket-server
v1.1.7
2022-04-19 13:38 UTC
Requires
- monolog/monolog: ^2.1
- symfony/event-dispatcher: >=4.4
- thenlabs/task-loop: ^1.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.2
- symfony/process: ^5.3
- thenlabs/pyramidal-tests: 2.0.x-dev
README
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 runphp 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