Я, наконец, нашел проблему, но не могу это объяснить. Сервер Webserver и Websocket Server работают на «127.0.0.1:xyz» каждый. Когда я получаю доступ к моему сайту с помощью «127.0.0.1:xy/app_dev.php/account», все работает, файлы cookie отправляются, считываются, а зарегистрированный пользователь возвращается клиентомManipulator.
Когда я обращаюсь к своему сайту с помощью «localhost: xy / app_dev.php / account», я всегда возвращаю анонимного пользователя, и файлы cookie не отправляются. Может кто-нибудь объяснить это мне, пожалуйста – и это повлияет и на режим производства? (например, пользователь может также подключиться к IP-адресу веб-сайта – и тогда это приведет меня к той же проблеме, не так ли?)
Этот вопрос связан с этим . (Symfony 2.7)
Я реализовал пакет Gos Websocket Bundle и теперь могу отправлять сообщения в реальном времени на каналы, на которых пользователи могут подписаться. В настоящее время проблема заключается в том, что у меня нет доступа к зарегистрированному в данный момент пользователю в пределах класса темы уведомления. Я уже пробовал все, что было подписано в связанной должности, с которой я связан.
В настоящее время я ввожу «@ security.token_storage» в свою тему, но, как я уже сказал, поведение одинаково для других подходов. Я думаю, что это проблема «cookie / domain», файлы cookie не отправляются на сервер websocket. Вот моя конфигурация:
Веб- сервер Symfony / php: «Сервер работает на http://127.0.0.1:8000 »
Gos websocket config.yml:
gos_web_socket: server: port: 8081 #The port the socket server will listen on host: 127.0.0.1 #The host ip to bind to router: resources: - @MessageBundle/Resources/config/pubsub/routing.yml client: firewall: main session_handler: @session.handler.pdo pushers: zmq: host: 127.0.0.1 port: 5555 persistent: true protocol: tcp
@ session.handler.pdo в services.yml:
pdo: class: PDO arguments: dsn: mysql:host=%database_host%;port=%database_port%;dbname=%database_name% user: %database_user% password: %database_password% calls: - [ setAttribute, [3, 2] ] # \PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION session.handler.pdo: class: Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler arguments: [@pdo, {lock_mode: 0}]
Сессия Framework, настроенная на использование обработчика pdo:
session: # handler_id set to null will use default session handler from php.ini handler_id: session.handler.pdo
Часть JavaScript для подключения клиента с websocket:
var webSocket = WS.connect("ws://127.0.0.1:8000"); webSocket.on("socket/connect", function(session){ session.subscribe("account/notification", function(uri, payload){ console.log("Received message", payload.msg); }); });
Это моя конфигурация, хранилище токенов вводится в службу для темы уведомления. Метод «onSubscribe» темы попадает, но пользователь остается анонимным, даже если я вошел в систему:
public function onSubscribe(ConnectionInterface $connection, Topic $topic, WampRequest $request) { // always returns anonym dump($this->tokenStorage->getToken()->getUser());die; }
Что я упустил ?
С уважением.
Поскольку это сейчас ясно, объяснение находится в ограничениях HTTP cookie. Более подробную информацию можно найти здесь: http://www.cookiecentral.com/faq/#4.3
«Основной предел получения файла cookie заключается в том, что вы можете получать только куки, которые действительны для документа, в котором находится ваш скрипт. То есть сценарий на http://www.myserver.com не может читать файлы cookie с сайта http://www.yourserver.com».
Кроме того, я предлагаю вам обеспечить запуск вашего веб-сервера в домене «localhost» для доступа к вашему сайту с помощью «localhost». При этом оба домена будут по-прежнему соответствовать.
В качестве вопроса для себя я никогда не проверял, разрешает ли доступ к веб-сайту по его адресу (127.0.0.1), а сервер websocket, запущенный на «localhost», запускает ту же проблему. В любом случае, чтобы ответить вам, нет, это не должно воспроизводиться раз в prod, как только у вас есть правильный домен (а не ip).
Однако ответ Томаса неверен, вы не можете запускать оба сервера на одном и том же порту, так как это определение для портов (один порт, один сервис / процесс): https://en.wikipedia.org/wiki/Port_ % 28computer_networking% 29 .
Чтобы разделить сеанс между веб-приложением и веб-сайтом, оба должны работать в одном домене и том же порту, иначе cookie не будет отправлен браузером
Web app: http://www.exemple.com:80 Websocket: ws://ws.exemple.com:80
и cookie должен быть настроен для домена exampleple.com (без какого-либо субдомена)
Кажется, что ваш конфиг настроен для порта 8081 для websocket, когда ваш веб-сервер работает на порту 8000
Надеюсь это поможет