Я использую PHP-WSS в приложении laravel, и мне нужно держать клиент websocket открытым для получения различных сообщений от сервера websocket.
На данный момент я создал php-скрипт CLI, который могу выполнять и ждать прибытия сообщений.
Я создал следующую функцию для тестирования...
Вопрос в том, чтобы держать соединение открытым для любых сообщений, которые могут быть отправлены с сервера, хороший ли это подход сделать это, как показано ниже, используя цикл while(true)? Могу ли я сделать это лучше? (Мне это кажется грязным, и хотелось бы улучшить его и сделать правильно)
function testWebsocketClient() {
$url = 'wss://example.com/?token=xyz123456';
$client = new WebSocketClient($url, new ClientConfig());
while(true){
sleep(5);
$client->send('test');
$return = $client->receive(); // test received OK
}
return $return;
}
ОБНОВЛЕНИЕ: Любой, кто использует PHP-WSS, обнаружил ошибку в Connection.php в методе BroadCast.
Исходная функция пытается отправить сообщение при разорванном соединении, что показывает следующую ошибку
Пустое чтение; соединение разорвано?
(обратите внимание на EOF = true)
public function broadCast(string $data): void
{
foreach ($this->clients as $client) {
if (is_resource($client) ) { // check if not yet closed/broken etc
fwrite($client, $this->encode($data));
} else {
echo 'Skipping a closed connection';
}
}
}
Я изменил его на
public function broadCast(string $data): void
{
foreach ($this->clients as $client) {
//echo PHP_EOL. stream_get_status($client) .PHP_EOL;
$clientMeta = ( stream_get_meta_data($client) );
$clientEof = $clientMeta['eof'];
if (is_resource($client) && $clientEof == false ) { // check if not yet closed/broken etc
fwrite($client, $this->encode($data));
} else {
echo 'Skipping a closed connection';
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/684 ... ction-open