Git Repository Public Repository

namibia

URLs

Copy to Clipboard
 
90d6a07e7e4539815d3e24e48c81d37282fb4e71
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
<?php
namespace Daemon;


use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;

/**
 * Meet Damien, our client connectivity application.
 * @author andre.fourie
 */
class Damien implements MessageComponentInterface
{

	/**
	 * General debugging switch.
	 * @var boolean
	 */
	protected $debug = false;
	/**
	 * Worker server ip address.
	 * @var string
	 */
	protected $workerIp = '127.0.0.1';
	/**
	 * Client websocket connections.
	 * @var array
	 */
	protected $clients;
	/**
	 * Worker websocket connections.
	 * @var array
	 */
	protected $workers;
	/**
	 * Gearman connection.
	 * @var \GearmanClient
	 */
	protected $gearClient;


	/**
	 * Setup the basics.
	 */
	public function __construct()
	{
		$this->clients    = array();
		$this->workers    = array();
		$this->gearClient = new \GearmanClient();
		$this->gearClient->addServer();
	}




	### ------------------------------------------------------ CONNECTION EVENT HANDLING
	/**
	 * Handle new websocket connections.
	 * @param  ConnectionInterface $from Websocket connection interface
	 * @return null
	 */
	public function onOpen(ConnectionInterface $conn)
	{
		#-> Store the new connection.
		$this->clients[$conn->resourceId] = $conn;
		if ($this->debug)
		{
			$this->gearClient->doBackground(
				'Log',
				json_encode(
					array(
						'message' => "\nConnections: " . count($this->clients) . "\n"
						             . 'Memory usage: ' . round(memory_get_usage(true) / 1048576, 2) . 'mb'
					)
				)
			);
		}
	}

	/**
	 * Handle received websocket messages.
	 * @param  ConnectionInterface $conn    Websocket connection interface
	 * @param  string              $message Message from connected client
	 * @return null
	 */
	public function onMessage(ConnectionInterface $conn, $message)
	{
		$workload = json_decode($message, true);
		if (isset($workload['ping']))
		{
			$conn->send('{"pong":true}');
		}
	}

	/**
	 * Handle websocket connection closure.
	 * @param  ConnectionInterface $conn Websocket connection interface
	 * @return null
	 */
	public function onClose(ConnectionInterface $conn)
	{
		#-> Client connection closed, do some cleanup.
		unset($this->clients[$conn->resourceId]);
		gc_collect_cycles();
		if ($this->debug)
		{
			$this->gearClient->doBackground(
				'Log',
				json_encode(
					array(
						'message' => "\nConnections: " . count($this->clients) . "\n"
						             . 'Memory usage: ' . round(memory_get_usage(true) / 1048576, 2) . 'mb'
					)
				)
			);
		}
	}

	/**
	 * Handle websocket connection error.
	 * @param  ConnectionInterface $conn Websocket connection interface
	 * @param  \Exception          $e    The exception instance
	 * @return null
	 */
	public function onError(ConnectionInterface $conn, \Exception $e)
	{
		#-> Nasty connection error, close the connection.
		if ($this->debug)
		{
			$this->gearClient->doBackground(
				'Log',
				json_encode(
					array(
						'message' => 'SocketApp Connection Error: ' . $e->getMessage()
					)
				)
			);
		}
		$conn->close();
	}

	/**
	 * Handle new ZeroMQ message.
	 * @param  String $message Serialized message from ZeroMQ
	 * @return null
	 */
	public function onQueueMessage($message)
	{
		#-> Broadcast.
		$start = microtime(true);
		foreach ($this->clients as $id => $conn)
		{
			$conn->send($message);
		}
		$time = round(microtime(true) - $start, 3);
		$this->gearClient->doBackground(
			'Log',
			json_encode(
				array(
					'message' => 'Connections: ' . count($this->clients) . '; Cost: ' . $time
				)
			)
		);
	}


}

Commits for namibia/daemon/SocketApp.php

Diff revisions: vs.
Revision Author Commited Message
df0489 ... Mark Fri 14 Oct, 2016 10:01:00 +0000

initial commit