1: <?php
2:
3: namespace Budabot\Core;
4:
5: 6: 7:
8: class SocketManager {
9: private $socketNotifiers = array();
10: private $monitoredSocketsByType = array();
11:
12: public function __construct() {
13: $this->monitoredSocketsByType[SocketNotifier::ACTIVITY_READ] = array();
14: $this->monitoredSocketsByType[SocketNotifier::ACTIVITY_WRITE] = array();
15: $this->monitoredSocketsByType[SocketNotifier::ACTIVITY_ERROR] = array();
16: }
17:
18: public function checkMonitoredSockets() {
19: $read = $this->monitoredSocketsByType[SocketNotifier::ACTIVITY_READ];
20: $write = $this->monitoredSocketsByType[SocketNotifier::ACTIVITY_WRITE];
21: $except = $this->monitoredSocketsByType[SocketNotifier::ACTIVITY_ERROR];
22: if ($read || $write || $except) {
23: if (0 < stream_select($read, $write, $except, 0)) {
24: foreach ($this->socketNotifiers as $notifier) {
25: $socket = $notifier->getSocket();
26: $type = $notifier->getType();
27:
28: if (in_array($socket, $read) && $type & SocketNotifier::ACTIVITY_READ) {
29: $notifier->notify(SocketNotifier::ACTIVITY_READ);
30: }
31: if (in_array($socket, $write) && $type & SocketNotifier::ACTIVITY_WRITE) {
32: $notifier->notify(SocketNotifier::ACTIVITY_WRITE);
33: }
34: if (in_array($socket, $except) && $type & SocketNotifier::ACTIVITY_ERROR) {
35: $notifier->notify(SocketNotifier::ACTIVITY_ERROR);
36: }
37: }
38: }
39: }
40: }
41:
42: 43: 44: 45:
46: public function addSocketNotifier($socketNotifier) {
47: $this->socketNotifiers []= $socketNotifier;
48:
49:
50: if ($socketNotifier->getType() & SocketNotifier::ACTIVITY_READ) {
51: $this->monitoredSocketsByType[SocketNotifier::ACTIVITY_READ][] = $socketNotifier->getSocket();
52: }
53: if ($socketNotifier->getType() & SocketNotifier::ACTIVITY_WRITE) {
54: $this->monitoredSocketsByType[SocketNotifier::ACTIVITY_WRITE][] = $socketNotifier->getSocket();
55: }
56: if ($socketNotifier->getType() & SocketNotifier::ACTIVITY_ERROR) {
57: $this->monitoredSocketsByType[SocketNotifier::ACTIVITY_ERROR][] = $socketNotifier->getSocket();
58: }
59: }
60:
61: 62: 63:
64: public function removeSocketNotifier($socketNotifier) {
65: if (is_object($socketNotifier) == false) {
66: return;
67: }
68:
69: $this->removeOne($this->socketNotifiers, $socketNotifier);
70:
71: if ($socketNotifier->getType() & SocketNotifier::ACTIVITY_READ) {
72: $this->removeOne($this->monitoredSocketsByType[SocketNotifier::ACTIVITY_READ], $socketNotifier->getSocket());
73: }
74: if ($socketNotifier->getType() & SocketNotifier::ACTIVITY_WRITE) {
75: $this->removeOne($this->monitoredSocketsByType[SocketNotifier::ACTIVITY_WRITE], $socketNotifier->getSocket());
76: }
77: if ($socketNotifier->getType() & SocketNotifier::ACTIVITY_ERROR) {
78: $this->removeOne($this->monitoredSocketsByType[SocketNotifier::ACTIVITY_ERROR], $socketNotifier->getSocket());
79: }
80: }
81:
82: private function removeOne(&$array, $value) {
83: $key = array_search($value, $array, true);
84: if ($key !== false) {
85: unset($array[$key]);
86: }
87: }
88: }
89: