Задать вопрос

Как связать WebSockets с MVC PHP?

Есть простой пример сокета JS:
let socket = new WebSocket("ws://mvs.com/feed/socket")

        socket.onopen = () => {
            console.log('Connected')
        }
        socket.onerror = (error) => {
            console.log(error.message)
        }

        socket.onclose = () => {
            console.log('Connected closed')
        }

        socket.onmessage = (event) => {
            var data = JSON.parse(event.data)

            console.log("Type: " + data.type)
            console.log("Type: " + data.message)
        }

Есть контроллер FeedController.php в нём я создал actionSocket(Так же есть сам роут в файле route.php):
public function actionSocket() {
        $feedData = new FeedData();

        $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

        socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
        socket_bind($socket, 0, PORT);

        socket_listen($socket);

        while (true) {
            $newSocket = socket_accept($socket);
            $header = socket_read($newSocket, 1024);
            $feedData->sendHeaders($header, $newSocket, 'mvs.com/feed', PORT);
        }
        socket_close($socket);
    }


И есть компонент FeedData.php:
class FeedData
{
    public function sendHeaders($headersText, $newSocket, $host, $port) {
        $headers = array();
        $tmpLine = preg_split("/\r\n/", $headersText);

        foreach ($tmpLine as $line) {
            $line = rtrim($line);
            if (preg_match('/\A(\S+): (.*)\z/', $line, $matches)) {
                $headers[$matches[1]] = $matches[2];
            }
        }
        $key = $headers['Sec-WebSocket-Key'];
        $sKey = base64_encode(pack('H*', sha1($key.'258EAFA5-E914-47DA-95CA-C5AB0DC85B1')));

        $strHeader = "HTTP/1.1 101 Switching Protocols \r\n".
            "Upgrade: websocket\r\n".
            "Connection: Upgrade\r\n".
            "WebSocket-Origin: $host\r\n".
            "WebSocket-Location: ws://$host:$port/feed/socket\r\n".
            "Sec-WebSocket-Accept: $sKey\r\n\r\n"
        ;
        socket_write($newSocket, $strHeader, strlen($strHeader));
    }
}

Так вот, как запустить данный скрипт?
Везде смотрю, все запускает через консоль php -f testserver.php, какой файл нужно запускать и вообще нужно ли? Помогите разобраться!
  • Вопрос задан
  • 156 просмотров
Подписаться 1 Средний 6 комментариев
Пригласить эксперта
Ответы на вопрос 3
sergiks
@sergiks Куратор тега PHP
♬♬
Для работы с WebSocket из PHP требуется не только обычный PHP-код с циклами и пр., но и дополнительные возможности, сверх обычного PHP. Например, Swoole, всяко рекомендую. Это модуль для PHP, позволяющий строить асинхронные высоконагруженные приложения. Код запускает под капотом несколько процессов, которые реагируют на события, не блокируют друг друга: пока один «ждёт», другие выполняются.

Вот пример реализации WebSocket сервера и JS клиента.
Ответ написан
@66demon666
Сетевой админ, АТС-админ
А может не надо копипастить то, что вам самим непонятно и использовать Ratchet/Workerman?
Ответ написан
1. Не исаользовать php для сокетов, а накалякать рядом лежащий микросервис на подходящем для этого языке (к примеру go, phyton, nodejs) и общаться с ним через брокер или вебхуками
2. "Пропатчить" пыху и добавить в него экстенш swoole или аналогичный. По сложности усвоееия и установке это равнозначно изучению и установке того же go, phyton или nodejs. Так что как вам будет удобнее (я склоняюсь к первому варианту)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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