Задать вопрос
BarnyBroken
@BarnyBroken
Дизайнер, веб-разработчик.

Как подключиться к phpDaemon?

Добрый день.

В общем установил phpDaemon. Создал пул, создал приложение. Запустил. В логах все UP. Подключить хоть убейте не могу. Статус ошибки 3 (disconnected).

Что сделал:
Pool:Servers\WebSocket {
	enable 1;
        privileged;
	listen 'tcp://0.0.0.0';
	port 8047;
}

MyWebSocket {}


Приложение:
<?php
namespace PHPDaemon\Applications;

class MyWebSocket extends \PHPDaemon\Core\AppInstance {

	public $enableRPC=true; // Без этой строчки не будут работать широковещательные вызовы
	public $sessions=array(); // Здесь будем хранить указатели на сессии подключившихся клиентов

	// С этого метода начинается работа нашего приложения
	public function onReady() {
		$appInstance = $this;
		
		// Метод timerTask() будет вызываться каждые 5 секунд
		$this->timerTask($appInstance);
		
		// Наше приложение будет доступно по адресу ws://site.com:8047/myws
		\PHPDaemon\Servers\WebSocket\Pool::getInstance()->addRoute('myws', function ($client) use ($appInstance) {
			$session=new MyWebSocketRoute($client, $appInstance); // Создаем сессию
			$session->id=uniqid(); // Назначаем ей уникальный ID
			$this->sessions[$session->id]=$session; //Сохраняем в массив
			return $session;
		});

	}

	function timerTask($appInstance) {
		// Отправляем каждому клиенту свое сообщение
		foreach($this->sessions as $id=>$session) {
			$session->client->sendFrame('This is private message to client with ID '.$id, 'STRING');
		}
		
		// После отправляем всем клиентам сообщение от каждого воркера (широковещательный вызов)
		$appInstance->broadcastCall('sendBcMessage', array(\PHPDaemon\Core\Daemon::$process->getPid()));
		
		// Перезапускаем наш метод спустя 5 секунд
		\PHPDaemon\Core\Timer::add(function($event) use ($appInstance) {
			$this->timerTask($appInstance);
			$event->finish();
		}, 5e6); // Время задается в микросекундах
	}
	
	// Функция для широковещательного вызова (при вызове срабатывает во всех воркерах)
	public function sendBcMessage($pid) {
		foreach($this->sessions as $id=>$session) {
			$session->client->sendFrame('This is broadcast message from worker #'.$pid, 'STRING');
		}
	}

}

class MyWebSocketRoute extends \PHPDaemon\WebSocket\Route {

	public $client;
	public $appInstance;
	public $id; // Здесь храним ID сессии

	public function __construct($client,$appInstance) {
		$this->client=$client;
		$this->appInstance=$appInstance;
	}
	
	// Этот метод срабатывает сообщении от клиента
	public function onFrame($data, $type) {
		// Отправляем ему ответ
		$this->client->sendFrame('Server receive from client #'.$this->id.' message "'.$data.'"', 'STRING');
	}
	
	// Этот метод срабатывает при закрытии соединения клиентом
	public function onFinish() {
		// Удаляем сессию из массива
		unset($this->appInstance->sessions[$this->id]);
	}

}


Воркеры указал от 1 до 50. Все вроде сделал хорошо, перезапустил phpd. Зашел в логи, все хорошо:
Wed, 8 Aug 2018 10:41:25.090911 +0000] W#12834 \PHPDaemon\Applications\MyWebSocket up.
[Wed, 8 Aug 2018 10:45:44.521788 +0000] M#12851 \PHPDaemon\Core\Pool:Servers\WebSocket up.
[Wed, 8 Aug 2018 10:45:44.529519 +0000] M#12851 \PHPDaemon\Core\Pool:\PHPDaemon\Servers\WebSocket\Pool up.
[Wed, 8 Aug 2018 10:45:44.544001 +0000] W#12853 \PHPDaemon\Applications\MyWebSocket up.
[Wed, 8 Aug 2018 10:45:45.738843 +0000] Spawning 1 worker(s)
[Wed, 8 Aug 2018 10:45:46.046952 +0000] W#12855 \PHPDaemon\Applications\MyWebSocket up.


Подключаюсь к ws://10.10.10.23:8047/myws (сервер локальный). Не фурычит. Все уже перепробовал.
Подскажите что не так я сделал ?
  • Вопрос задан
  • 197 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы