class DumpServer
A server collecting Data clones sent by a ServerDumper.
@author Maxime Steinhausser <maxime.steinhausser@gmail.com>
@final
Hierarchy
- class \Symfony\Component\VarDumper\Server\DumpServer
Expanded class hierarchy of DumpServer
1 file declares its use of DumpServer
- ServerDumpCommand.php in vendor/
symfony/ var-dumper/ Command/ ServerDumpCommand.php
File
-
vendor/
symfony/ var-dumper/ Server/ DumpServer.php, line 25
Namespace
Symfony\Component\VarDumper\ServerView source
class DumpServer {
private string $host;
/**
* @var resource|null
*/
private $socket;
public function __construct(string $host, ?LoggerInterface $logger = null) {
if (!str_contains($host, '://')) {
$host = 'tcp://' . $host;
}
$this->host = $host;
}
public function start() : void {
if (!($this->socket = stream_socket_server($this->host, $errno, $errstr))) {
throw new \RuntimeException(\sprintf('Server start failed on "%s": ', $this->host) . $errstr . ' ' . $errno);
}
}
public function listen(callable $callback) : void {
if (null === $this->socket) {
$this->start();
}
foreach ($this->getMessages() as $clientId => $message) {
$this->logger?->info('Received a payload from client {clientId}', [
'clientId' => $clientId,
]);
$payload = @unserialize(base64_decode($message), [
'allowed_classes' => [
Data::class,
Stub::class,
],
]);
// Impossible to decode the message, give up.
if (false === $payload) {
$this->logger?->warning('Unable to decode a message from {clientId} client.', [
'clientId' => $clientId,
]);
continue;
}
if (!\is_array($payload) || \count($payload) < 2 || !$payload[0] instanceof Data || !\is_array($payload[1])) {
$this->logger?->warning('Invalid payload from {clientId} client. Expected an array of two elements (Data $data, array $context)', [
'clientId' => $clientId,
]);
continue;
}
[
$data,
$context,
] = $payload;
$callback($data, $context, $clientId);
}
}
public function getHost() : string {
return $this->host;
}
private function getMessages() : iterable {
$sockets = [
(int) $this->socket => $this->socket,
];
$write = [];
while (true) {
$read = $sockets;
stream_select($read, $write, $write, null);
foreach ($read as $stream) {
if ($this->socket === $stream) {
$stream = stream_socket_accept($this->socket);
$sockets[(int) $stream] = $stream;
}
elseif (feof($stream)) {
unset($sockets[(int) $stream]);
fclose($stream);
}
else {
(yield (int) $stream => fgets($stream));
}
}
}
}
}
Members
Title Sort descending | Modifiers | Object type | Summary |
---|---|---|---|
DumpServer::$host | private | property | |
DumpServer::$socket | private | property | |
DumpServer::getHost | public | function | |
DumpServer::getMessages | private | function | |
DumpServer::listen | public | function | |
DumpServer::start | public | function | |
DumpServer::__construct | public | function |