Skip to content

Instantly share code, notes, and snippets.

@lotharthesavior
Last active May 16, 2022 04:22
Show Gist options
  • Save lotharthesavior/afc2f84eaffbd4929e642858fa3c7111 to your computer and use it in GitHub Desktop.
Save lotharthesavior/afc2f84eaffbd4929e642858fa3c7111 to your computer and use it in GitHub Desktop.
Identifying WebSocket Message author with OpenSwoole
<?php
use Swoole\Websocket\Server;
use Swoole\Http\Request;
use Swoole\WebSocket\Frame;
$server = new Server("0.0.0.0", 9501);
$server->table = (require __DIR__ . DIRECTORY_SEPARATOR . 'user-table.php')();
$server->on("start", function (Server $server) {
echo 'Swoole WebSocket Server is started at http://127.0.0.1:9501' . PHP_EOL;
});
$server->on('open', function(Server $server, Request $request) {
// here we expect the incoming connection to come as "ws://my-ws-server/?name=My-Name-Here"
if (!isset($request->server['query_string'])) {
$server->disconnect($request->fd, 401, 'Please, inform your name for this connection.');
return;
}
parse_str($request->server['query_string'], $parsed_query);
$server->table->set($request->fd, ['id' => $request->fd, 'name' => $parsed_query['name']]);
echo 'Connection open: ' . $request->fd . PHP_EOL;
});
$server->on('message', function(Server $server, Frame $frame) {
$user_name = $server->table->get($frame->fd, 'name');
echo 'Received message (' . $user_name . '): ' . $frame->data . PHP_EOL;
$connections = $server->connection_list(0);
foreach ($connections as $fd) {
if ($frame->fd === $fd) {
$server->push($fd, 'My message: ' . $frame->data);
} else {
$server->push($fd, $user_name . '\'s message: ' . $frame->data);
}
}
});
$server->on('close', function(Server $server, $fd) {
echo 'Connection close: ' . $fd . PHP_EOL;
$server->user_table->del($fd);
});
$server->start();
<?php
use Swoole\Table;
return function(): Table {
$table = new Table(1024, 1);
$table->column('id', Swoole\Table::TYPE_INT);
$table->column('name', Swoole\Table::TYPE_STRING, 64);
$table->create();
return $table;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment