bigbits Ответов: 1

Как мне сделать это javascript .onmessage в PHP ( websocket )


Я пытаюсь сделать это на php

websocket.onmessage = function(evt) {  
    console.log("Message Received: " + evt.data);  
    }; 


Кто-нибудь может помочь ?

Что я уже пробовал:

Мой php код:

// SEND TO THE SERVER THE JSON
$client->send( json_encode($info) );

// RECEIVED THE INFORMATION
$data = json_decode( $client->receive() );

$x=0; // JUST A COUNTER SO THE WHILE WON'T LOOP FOREVER

// TRIED WHILE BUT NO GOOD
while ($x<10) {
​
sleep(1);
echo $x."<br>";
echo $client->receive();

}


В результате получается смесь нужной мне информации и ошибок;

7a6efd45-8a35-4530-a477-b25bd5b584ff0
{"success":true}
{"values":{"0":"16:59:21","3":"22,66","4":"22,66"},"type":"QuoteType","parameter":"petr4"}
{"values":{"0":"16:59:22","3":"22,77","4":"22,77"},"type":"QuoteType","parameter":"petr4"}


И СООБЩЕНИЕ ОБ ОШИБКЕ
Фатальная ошибка: Uncaught WebSocket\ConnectionException: пустое чтение; соединение мертво? Состояние потока: {
"крипто":{"протокола":"в протоколе TLSv1.2","cipher_name":"протокола ECDHE-RSA-на-AES128-GCM не-и SHA256","cipher_bits":128,
"cipher_version":"TLSv1.2"},"timed_out":true,"blocked":true,"eof":false,"stream_type":"tcp_socket\/ssl",
"mode":"r+","unread_bytes":0,"seekable":false} in F:\xampp-php72\...\websocket\lib\Base.php:269
Трассировка стека: #0 F:\xampp-php72\htdocs\testcodes\call\vendor\textalk\websocket\lib\Base.php(143):
WebSocket\Base->read(2) #1 F:\xampp-php72\htdocs\testcodes\call\vendor\textalk\websocket\lib\Base.php(135):
WebSocket\Base->receive_fragment() #2 F:\xampp-php72\htdocs\...\example.php(57):
WebSocket\Base->receive() #3 {main} брошен F:\xampp-php72\htdocs\...\websocket\lib\Base.php на линии 269

Sandeep Mewara

Кстати, вы написали: $x=0; // просто счетчик, так что WHILE не будет петлять вечно
но в цикле while$ x не изменился. Это бесконечный цикл while.

Sandeep Mewara

можете ли вы объяснить: в результате получается смесь нужной мне информации и ошибки;

вы получаете комбинацию в результате? или сказать, что когда все хорошо, вы получаете успех, а когда нет - вы получаете ошибку.

bigbits

Успех-это соединение и маркер. Я попытался упростить пример, но, возможно, эта дополнительная информация не была необходима ( токен и успех ).

В принципе, я как клиент websocket отправляю информацию, и мне нужно поддерживать соединение и получать любые обновления с сервера websocket ( от третьей стороны ).

Я попробовал while и внутри while вызвать $client->receive(); но ошибка, которую я получаю в 99% случаев, такова:

Uncaught WebSocket\ConnectionException: Пусто
WebSocket\Base->receive_fragment()

Извините, если я еще больше запутал вас.

bigbits

у него действительно есть $x++; это просто то, что я быстро скопировал и вставил. До того, как условие стало истинным.

Для меня важно воспроизвести то же самое принимающее состояние.

1 Ответов

Рейтинг:
2

W∴ Balboos, GHB

Ошибка заключается в том, что ваш цикл, даже если у вас был активирован счетчик $x++, может (и делает) все еще пытаться читать, когда нет данных для чтения.

Ваше состояние должно быть проверено на читаемость данных [

$client->receive();
] и не просто какой-то счетчик, который не только может позволить вам перескочить (как вы это делаете), но и не обязательно читать все доступные данные, если $x увеличивает (когда вы увеличиваете его, конечно) произвольное ограничение '10'