@Flex78

PHP, websocket, как обрабатывать данные?

Здравствуйте! У меня мало практики и знаний в программировании на PHP, но для своих целей хватало. Интернет есть, добрые люди помогают. И вот я снова прошу помощи, в интернете не смог найти то что нужно. Речь идет про работу с websocket на PHP. Никогда с ними ранее не сталкивался, нашел кое какие описания, подключил библиотеки и вроде все нормально, но... всегда есть но! Кстати с классами я тоже не работал, а как я понимаю в составе библиотек приходится с ними работать. Вот код на одной площадке, который мне дали для работы с websocket

require __DIR__ . '/vendor/autoload.php';

\Ratchet\Client\connect('wss://ws.binaryws.com/websockets/v3?app_id=1089')->then(
		function($conn) {
			$conn->on('message', function($msg) use ($conn) {
				$msg_php = json_decode($msg, 1); 
				$conn->close();
			});
			
			$conn->send('{"authorize" : "'.$token.'"}');
		});


То с чем у меня сложности:
1. вот сюда "$conn->send('{"authorize" : "'.$token.'"}');" мне нужно передать токен. Я не знаю как это сделать кроме как объявить переменную глобальной. Подскажите еще вариант пожалуйста.
2. Вот отсюда "$msg_php = json_decode($msg, 1); " нужно вытащить все данные за пределы функций/класса для дальнейшей обработки, и тут я совсем не знаю как это сделать. Если при работе с функциями используется return, то как его использовать тут?
3. Можно ли переписать код что бы он воспринимался проще? Может глупый вопрос, но я не работал с классами, в основном использовал процедурный стиль программирования.

Заранее спасибо за помощь всем кто откликнется!
  • Вопрос задан
  • 214 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Kokoulin
Php senior developer
1. не надо работать с сокетами на php (то что вам предложили это костыль, который убивает весь смысл сокетов)
PHP синхронный язык, веб сокеты Асинхронные, работать крайне не наглядно. Держать открытое соединение на PHP, крайне дурная затея.

PS. Если вас приковали к батарее и заставляют, то вот примерное решение которое лишено смысла, но должно работать. После того как произойдет коннект и вы вернете данные вебсокет закроется.

Это лямбда функция, вам в нее просто нужно просто передать переменные в которых ждете результат
Возможно библеотека использует промисы, без классов тут не обойтись

<?php
class ClassName {
    private $status = false;
    private $result;

    function connect($token)
    {
        \Ratchet\Client\connect('wss://ws.binaryws.com/websockets/v3?app_id=1089')->then(
            function($conn) use ($token) {
                $conn->on('message', function($msg) use ($conn) {
                    $msg_php = json_decode($msg, 1);
                    $this->result = $msg_php;
                    $conn->close();
                });
                $conn->send('{"authorize" : "'.$token.'"}');
                $this->status = true;
            });
    }
    
    function getResult() 
    {
        if ($this->status) {
            return null;
        }
        return $this->result;
    }
}

$token = 'qwerty';

$obj = new ClassName();
$obj->connect($token);

$result = null;
for ($i = 0; $i < 3; $i++) {
    $result = $obj->getResult();
    if ($result != null) {
        break;
    }
    sleep(1);
}

var_dump($result);


Так как вам нужен клиент, то скорее всего вы пишете какого-то бота, сделайте это лучше на Golang куда проще будет
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы