Skip to content

Commit 4d0dc0f

Browse files
author
Johann Saunier
committed
Merge pull request #22 from GeniusesOfSymfony/pnctl-stack-component
PNTCL signal handler and Stack server component
2 parents eeee84d + 6ad88a8 commit 4d0dc0f

File tree

11 files changed

+174
-73
lines changed

11 files changed

+174
-73
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
/vendor/
1+
/vendor/
2+
composer.lock

Event/ClientEventListener.php

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,6 @@ public function onClientDisconnect(ClientEvent $event)
143143
? $user->getUsername()
144144
: $user;
145145

146-
147146
$this->logger->info(sprintf(
148147
'%s disconnected [%]',
149148
$username,
@@ -153,7 +152,6 @@ public function onClientDisconnect(ClientEvent $event)
153152
'session_id' => $conn->WAMP->sessionId,
154153
'storage_id' => $conn->WAMP->clientStorageId,
155154
));
156-
157155
} catch (StorageException $e) {
158156
$this->logger->info(sprintf(
159157
'%s disconnected [%s]',
@@ -179,7 +177,6 @@ public function onClientError(ClientErrorEvent $event)
179177
$conn = $event->getConnection();
180178
$e = $event->getException();
181179

182-
183180
$loggerContext = array(
184181
'connection_id' => $conn->resourceId,
185182
'session_id' => $conn->WAMP->sessionId,
@@ -195,7 +192,6 @@ public function onClientError(ClientErrorEvent $event)
195192
$e->getFile(),
196193
$e->getLine()
197194
), $loggerContext);
198-
199195
}
200196

201197
/**

Event/ServerEvent.php

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Gos\Bundle\WebSocketBundle\Event;
44

55
use React\EventLoop\LoopInterface;
6+
use React\Socket\Server;
67
use Symfony\Component\EventDispatcher\Event;
78

89
class ServerEvent extends Event
@@ -12,12 +13,19 @@ class ServerEvent extends Event
1213
*/
1314
protected $loop;
1415

16+
/**
17+
* @var Server
18+
*/
19+
protected $server;
20+
1521
/**
1622
* @param LoopInterface $loop
23+
* @param Server $server
1724
*/
18-
public function __construct(LoopInterface $loop)
25+
public function __construct(LoopInterface $loop, Server $server)
1926
{
2027
$this->loop = $loop;
28+
$this->server = $server;
2129
}
2230

2331
/**
@@ -29,4 +37,12 @@ public function getEventLoop()
2937
{
3038
return $this->loop;
3139
}
40+
41+
/**
42+
* @return Server
43+
*/
44+
public function getServer()
45+
{
46+
return $this->server;
47+
}
3248
}

Event/StartServerListener.php

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
<?php
2+
3+
namespace Gos\Bundle\WebSocketBundle\Event;
4+
5+
use Gos\Bundle\WebSocketBundle\Server\App\Registry\PeriodicRegistry;
6+
use Gos\Component\PnctlEventLoopEmitter\PnctlEmitter;
7+
use Psr\Log\LoggerInterface;
8+
use Psr\Log\NullLogger;
9+
use React\EventLoop\Timer\TimerInterface;
10+
11+
class StartServerListener
12+
{
13+
/**
14+
* @var PeriodicRegistry
15+
*/
16+
protected $periodicRegistry;
17+
18+
/**
19+
* @var LoggerInterface
20+
*/
21+
protected $logger;
22+
23+
/**
24+
* @param PeriodicRegistry $periodicRegistry
25+
* @param LoggerInterface $logger
26+
*/
27+
public function __construct(PeriodicRegistry $periodicRegistry, LoggerInterface $logger = null)
28+
{
29+
$this->periodicRegistry = $periodicRegistry;
30+
$this->logger = null === $logger ? new NullLogger() : $logger;
31+
}
32+
33+
/**
34+
* @param ServerEvent $event
35+
*/
36+
public function bindPnctlEvent(ServerEvent $event)
37+
{
38+
if(!extension_loaded('pcntl')){
39+
return;
40+
}
41+
42+
$loop = $event->getEventLoop();
43+
$server = $event->getServer();
44+
45+
$pnctlEmitter = new PnctlEmitter($loop);
46+
47+
$pnctlEmitter->on(SIGTERM, function () use ($server, $loop) {
48+
49+
$server->emit('end');
50+
$server->shutdown();
51+
$loop->stop();
52+
53+
$this->logger->notice('Server stopped !');
54+
});
55+
56+
$pnctlEmitter->on(SIGINT, function () use ($server, $loop) {
57+
58+
$this->logger->notice('Press CTLR+C again to stop the server');
59+
60+
if (SIGINT === pcntl_sigtimedwait([SIGINT], $siginfo, 5)) {
61+
$this->logger->notice('Stopping server ...');
62+
63+
$server->emit('end');
64+
$server->shutdown();
65+
66+
foreach ($this->periodicRegistry->getPeriodics() as $periodic) {
67+
if ($periodic instanceof TimerInterface && $loop->isTimerActive($periodic)) {
68+
$loop->cancelTimer($periodic);
69+
}
70+
}
71+
72+
$loop->stop();
73+
74+
$this->logger->notice('Server stopped !');
75+
} else {
76+
$this->logger->notice('CTLR+C not pressed, continue to run normally');
77+
}
78+
});
79+
80+
}
81+
}

Resources/config/services/services.yml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ services:
3636

3737
gos_web_socket.ws.server:
3838
class: Gos\Bundle\WebSocketBundle\Server\Type\WebSocketServer
39+
public: false
40+
lazy: true
3941
arguments:
4042
- %web_socket_server.host%
4143
- %web_socket_server.port%
@@ -61,6 +63,7 @@ services:
6163

6264
gos_web_socket.topic.dispatcher:
6365
class: Gos\Bundle\WebSocketBundle\Server\App\Dispatcher\TopicDispatcher
66+
lazy: true
6467
arguments:
6568
- @gos_web_socket.topic.registry
6669
- @gos_web_socket.router.wamp
@@ -77,6 +80,8 @@ services:
7780

7881
gos_web_socket_server.wamp_application:
7982
class: Gos\Bundle\WebSocketBundle\Server\App\WampApplication
83+
public: false
84+
lazy: true
8085
arguments:
8186
- @gos_web_socket.rpc.dispatcher
8287
- @gos_web_socket.topic.dispatcher
@@ -92,13 +97,18 @@ services:
9297

9398
gos_web_socket.client_storage.doctrine.decorator:
9499
class: Gos\Bundle\WebSocketBundle\Client\Driver\DoctrineCacheDriverDecorator
100+
lazy: true
101+
public: false
102+
# argument are set via compiler pass
95103

96104
gos_web_socket.client_event.listener:
97105
class: Gos\Bundle\WebSocketBundle\Event\ClientEventListener
98106
arguments:
99107
- @gos_web_socket.client_storage
100108
- @security.context
101109
- @?monolog.logger.websocket
110+
# other are set via compiler pass
111+
lazy: true
102112
tags:
103113
- { name: kernel.event_listener, event: 'gos_web_socket.client_connected', method: onClientConnect }
104114
- { name: kernel.event_listener, event: 'gos_web_socket.client_disconnected', method: onClientDisconnect }
@@ -113,18 +123,30 @@ services:
113123

114124
gos_web_socket.router.wamp:
115125
class: Gos\Bundle\WebSocketBundle\Router\WampRouter
126+
lazy: true
116127
arguments:
117128
- @gos_web_socket.null.pubsub.router
118129
- %kernel.debug%
119130
- @?monolog.logger.websocket
120131

121132
gos_web_socket.pdo.periodic_ping:
122133
class: Gos\Bundle\WebSocketBundle\Periodic\PdoPeriodicPing
134+
lazy: true
123135
arguments:
124136
- @?pdo
125137
- @?monolog.logger.websocket
126138

127139
gos_web_socket.memory_usage.periodic:
128140
class: Gos\Bundle\WebSocketBundle\Periodic\PeriodicMemoryUsage
141+
lazy: true
129142
arguments:
130143
- @?monolog.logger.websocket
144+
145+
gos_web_socket.pnctl_event.listener:
146+
class: Gos\Bundle\WebSocketBundle\Event\StartServerListener
147+
lazy: true
148+
arguments:
149+
- @gos_web_socket.periodic.registry
150+
- @?monolog.logger.websocket
151+
tags:
152+
- { name: kernel.event_listener, event: 'gos_web_socket.server_launched', method: bindPnctlEvent }

Server/App/Registry/OriginRegistry.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class OriginRegistry
1414

1515
public function __construct()
1616
{
17-
$this->origins = array();
17+
$this->origins = [];
1818
}
1919

2020
/**

Server/App/Registry/RpcRegistry.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class RpcRegistry
1616

1717
public function __construct()
1818
{
19-
$this->rpcHandlers = array();
19+
$this->rpcHandlers = [];
2020
}
2121

2222
/**

Server/App/Registry/ServerRegistry.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ class ServerRegistry
1414
*/
1515
protected $servers;
1616

17+
public function __construct()
18+
{
19+
$this->servers = [];
20+
}
21+
1722
/**
1823
* @param ServerInterface $server
1924
*/

Server/App/Registry/TopicRegistry.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class TopicRegistry
1616

1717
public function __construct()
1818
{
19-
$this->topics = array();
19+
$this->topics = [];
2020
}
2121

2222
/**

0 commit comments

Comments
 (0)