/
Client.php
89 lines (78 loc) · 2.07 KB
/
Client.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<?php
namespace Psonic;
use Psonic\Exceptions\ConnectionException;
use Psonic\Contracts\Client as ClientInterface;
use Psonic\Contracts\Command as CommandInterface;
use Psonic\Contracts\Response as ResponseInterface;
class Client implements ClientInterface
{
private $resource;
private $host;
private $port;
private $errorNo;
private $errorMessage;
private $maxTimeout;
/**
* Client constructor.
* @param string $host
* @param int $port
* @param int $timeout
*/
public function __construct($host = 'localhost', $port = 1491, $timeout = 30)
{
$this->host = $host;
$this->port = $port;
$this->maxTimeout = $timeout;
$this->errorNo = null;
$this->errorMessage = '';
}
/**
* @param CommandInterface $command
* @return ResponseInterface
* @throws ConnectionException
*/
public function send(CommandInterface $command): ResponseInterface
{
if (!$this->resource) {
throw new ConnectionException();
}
fwrite($this->resource, $command);
return $this->read();
}
/**
* reads the buffer from a given stream
* @return ResponseInterface
*/
public function read(): ResponseInterface
{
$message = stream_get_line($this->resource, 2048, "\r\n");
return new SonicResponse($message);
}
/**
* @throws ConnectionException
* connects to the socket
*/
public function connect()
{
if (!$this->resource = stream_socket_client("tcp://{$this->host}:{$this->port}", $this->errorNo, $this->errorMessage, $this->maxTimeout)) {
throw new ConnectionException();
}
}
/**
* Disconnects from a socket
*/
public function disconnect()
{
stream_socket_shutdown($this->resource, STREAM_SHUT_WR);
$this->resource = null;
}
/**
* @return bool
* clears the output buffer
*/
public function clearBuffer()
{
stream_get_line($this->resource, 4096, "\r\n");
return true;
}
}