public function start() { $addr = 'tcp://' . $this->config['ip'] . ':' . $this->config['port']; $this->socket = stream_socket_server($addr, $errno, $errstr); if (!$this->socket) { die("{$errstr} ({$errno})\n"); } while (true) { //формируем массив прослушиваемых сокетов: $read = $write1 = $this->connects; $read[] = $write[] = $this->socket; $write = $except = $read1 = $except1 = null; if (!stream_select($read, $write, $except, null)) { //ожидаем сокеты доступные для чтения (без таймаута) break; } if (in_array($this->socket, $read)) { //есть новое соединение //принимаем новое соединение и производим рукопожатие: if (($connect = stream_socket_accept($this->socket, -1)) && ($info = $this->handshake($connect))) { $this->connects[] = $connect; //добавляем его в список необходимых для обработки $this->onOpen($connect, $info); //вызываем пользовательский сценарий } unset($read[array_search($this->socket, $read)]); } foreach ($read as $connect) { //обрабатываем все соединения $data = fread($connect, 10000); if (!strlen($data)) { //соединение было закрыто fclose($connect); unset($this->connects[array_search($connect, $this->connects)]); $this->onClose($connect); //вызываем пользовательский сценарий continue; } else { stream_select($read1, $write1, $except1, null); //var_dump($write1); $this->onMessage($connect, $data); //вызываем пользовательский сценарий //unset($write1[ array_search($this->socket, $read) ]); foreach ($write1 as $connect1) { $senddata = SocketHelpers::decode($data); if ($senddata['type'] === 'text') { fwrite($connect1, SocketHelpers::encode($senddata['payload'])); } } } //fwrite($connect, encode('Success')); //ожидаем сокеты доступные для чтения (без таймаута) } } }
public function checkConnection() { $this->_connected = false; // send ping: $data = 'ping?'; @fwrite($this->_Socket, SocketHelpers::encode($data, 'ping', true)); $response = @fread($this->_Socket, 300); if (empty($response)) { return false; } $response = SocketHelpers::decode($response); if (!is_array($response)) { return false; } if (!isset($response['type']) || $response['type'] !== 'pong') { return false; } $this->_connected = true; return true; }