-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.php
85 lines (69 loc) · 2.27 KB
/
server.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
<?php
require_once __DIR__ . '/vendor/autoload.php';
$redisClientUri = 'redis://127.0.0.1:6000';
$socketServerUri = '127.0.0.1:8085'; // host, port, etc
$loop = \React\EventLoop\Factory::create();
$connections = [];
// http server
$server = new \React\Http\Server($loop, function (\Psr\Http\Message\ServerRequestInterface $request) use (&$connections, $socketServerUri) {
$path = $request->getUri()->getPath();
if ($path === '/') {
return new \React\Http\Message\Response(
200,
[
'Content-Type' => 'text/html',
'Set-Cookie' => 'poll_id' . '=' . md5(time())
],
str_replace('__SERVER_URL__', $socketServerUri, file_get_contents('poll.html'))
);
}
if ($path === '/poll') {
if (!isset($request->getCookieParams()['poll_id'])) {
return new \React\Http\Message\Response(
400,
['Content-Type' => 'text/html'],
'The request does not contain poll id'
);
}
$pollId = $request->getCookieParams()['poll_id'];
$stream = new \React\Stream\ThroughStream();
$connections[$pollId] = $stream;
return new \React\Http\Message\Response(
200,
['Content-Type' => 'text/plain'],
$stream
);
}
return new \React\Http\Message\Response(
404,
['Content-Type' => 'text/html'],
'Not Found'
);
});
// socket server
$socket = new \React\Socket\Server($socketServerUri, $loop);
$server->listen($socket);
echo sprintf("Server running at %s\n", $socket->getAddress());
/**
* Redis Client
*/
$factory = new \Clue\React\Redis\Factory($loop);
$client = $factory->createLazyClient($redisClientUri);
$client
->psubscribe('test')
->then(function () {
echo "New Redis subscription" . PHP_EOL;
}, function (\Exception $exception) use ($client) {
$client->close();
});
$client->on('pmessage', function ($pattern, $channel, $message) use (&$connections) {
echo 'pmessage' . $message . count($connections) . PHP_EOL;
foreach ($connections as $connection) {
/** @var \React\Stream\ThroughStream $connection */
$connection->end($message);
}
});
/**
* Start Loop
*/
$loop->run();