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

Как связать 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, какой файл нужно запускать и вообще нужно ли? Помогите разобраться!
  • Вопрос задан
  • 157 просмотров
Подписаться 1 Средний 6 комментариев
Ответ пользователя Mors Clamor К ответам на вопрос (3)
@66demon666
Сетевой админ, АТС-админ
А может не надо копипастить то, что вам самим непонятно и использовать Ratchet/Workerman?
Ответ написан