Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
WebSocket connection to 'ws://sharoid.ru:8000/' failed: Could not decode a text frame as UTF-8.if (($connect = stream_socket_accept($socket, -1)) && $info = handshake($connect)) {
$connects[] = $connect;//добавляем его в список необходимых для обработки
onOpen($connect, $info);//вызываем пользовательский сценарий
}
$connects[] = $connect;//добавляем его в список необходимых для обработки
$data = fread($connect, 100000);
if (!$data) { //соединение было закрыто
strlen($data).$write для stream_selectstrlen — зачем нужен лишний вызов?
socket_recv можно сэкономить на вызове strlen.врапперы — очевидно, что нет
socket_recv не использовал. Поэтому Вам и задал вопрос.if (!$data) {@fclose($client);}fgets($client);, а она ожидает конец строки или таймаут. клиент не может прислать 0, данные кодируются по протоколу вебсокета — если клиент отправит 0, то придёт ������
по-этому можно не делать strlen($data), а достаточно if (!$data)
!$data в цикле обработки использовать не стоит.stream_select, то сервер может получать данные по кускам.Это стоит 1000$
Эт
о с
тоит 1
0
00$
!$data, ошибочно закроет соединение. Каким бы способом сообщение не кодировалось, если там встречается «0» — соединение будет обработано неверно.Хотите получить сообщение (сообщения) из канала — отправляете запрос.
$isMasked = ($secondByteBinary[0] == '1') ? true : false;
while true; do nc sharoid.ru 8000 < /dev/zero ; done
phpdaemon и пр. не от хорошей жизни такие «монструозные», а из за того, что, в том числе, над безопасностью думают.select:select.stream_set_blocking да и read/write/fgets у вас используются так, как использовались бы с блокирующими сокетами. Мне кажется они у вас блокирующие… if (length($data) != ($written = fwrite($data))) {
$data = substr($data, $written),
}
и дописывать остаток когда сокет снова станет записываемым.if(!$data)) хоть всё вплоть до $length. Так что всегда нужно проверять достаточно ли данных считалось и если нет — сохранять в буфер и дожидаться, пока сокет снова станет readable.read($fd, 10000). Хотя насчёт этого не совсем уверен, возможно в PHP там промежуточные буферы какие то есть.
foreach($read as $connect) {//обрабатываем все соединения
...обрабатываем $connect
fwrite($connect, encode(Test::prt(decode($data)['payload'])));
public function prt($m){
return $m . 'work!';
}
work!
work!
fdwork!
work!
work!
fdwork!
А в 2022 хром позволит создать небезопасное соединение?
Один пхп скрипт легко подключается к другому, но вот при попытке подключиться с хрома после получения им строки:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Version: 13
Sec-WebSocket-Accept: Hrk+hHg1R1HNWSsCbXcOU60HIm8=
Происходит онеррор
Делаем вебсокеты на PHP с нуля