2015-09-11 5 views
1

Пожалуйста, со мной, поскольку это длинный вопрос, но есть много деталей, чтобы объяснить мою проблему.Может ли Nodejs проверить сеанс пользователя PHP?

О чем я работаю?

Я пытаюсь установить связь между PHP-приложением и REST-интерфейсом системы телефонии.

Поскольку мой сайт написан на PHP, я решил построить связь с помощью PHP, сделав вызовы cURL API.

довести вас до скорости, есть 2 вида связи между пользователем и API, и я хотел бы поставить их на две различные категории

  • Отправить После приема/Once Пример этого будет , попытайтесь набрать новый номер телефона «dial 800-123-4567». API принимает запрос и возвращает идентификатор взаимодействия, чтобы позволить пользователю управлять вызовом (т. Е. Отключать, отключать звук, переносить на удержание ....)
  • Отправлять раз в секунду В этом сообщении я создать «постоянное» соединение между сеансом пользователя и API. Затем каждую секунду я проверю API для новых сообщений. После получения сообщения из API я должен обновить кеш пользователя, прочитать кеш последнего пользователя и, наконец, отправить браузеру данные кэша.

Проблема? HTTP не имеет гражданства.

Каждый запрос, отправленный пользователем на веб-сервер, создает новое TCP-соединение. Проблема в том, что каждую секунду я запрашиваю API для новых сообщений, у меня будет новое TCP-соединение. В среднем при каждом дате времени для каждого пользователя требуется около 200 TCP-соединений. Поэтому, если у меня 300 пользователей, использующих приложение/сервер, то это около 60 000 TCP-соединений, открытых для веб-сервера. Поскольку вы можете ясно видеть, что решение не очень хорошо масштабируется здесь, и это вопрос времени, прежде чем сервер взорвется на моем лице ... :(

Еще одна проблема заключается в том, что PHP не является асинхронным, что вызывает проблемы, если сообщение для API потребовались более длинные или возвратные ошибки.

FWIW Я попытался использовать JavaScript SharedWorker для устранения некоторых накладных расходов. Я каждый раз пробовал Server-sent-events, но пользователь все еще генерировал слишком много TCP-соединений с сервером. ничто в первую очередь не помогло мне немного уменьшить соединение.

Может ли Nodejs помочь?

Мне было предложено несколько человек использовать Nodejs вместо PHP для этой задачи. Конечно, я не собираюсь менять свое PHP-приложение в Nodejs, так как это было бы безумным, поскольку мое приложение огромно.

Я хотел бы рассмотреть возможность запуска сервера nodejs в качестве посредника между сервером PHP и сервисом API. Идея состоит в том, чтобы на сервере узла был запущен WebSocket. Затем клиент будет передавать любое сообщение в websocket, и websocket затем отправит сообщение на сервер. Это не звучит плохо на высоком уровне, но, как только копайте глубже, кажется, становится все сложнее.

Nodejs вызов

Когда пользователь входит в мой PHP-приложение, я проверить свои учетные данные, и как только они в то создать сеанс, который хранится в базе данных MySQL. Сеанс в силе следующее должно быть правильным

  • IP-адрес должен совпадать с Ip, который создал сеанс
  • Данные агент также должен соответствовать (я могу жить без него nodejs)
  • Время простоя сеанса должен быть меньше 900 секунд.

Для того, чтобы Nodejs начал связь, он должен сначала создать новое соединение с API. После того, как соединение принято, nodejs необходимо следить за следующими данными "полученных с помощью API"

  1. CSFR маркер
  2. Id Session
  3. Http Cookie

для того, чтобы Nodejs сделать соединение с API должно передавать имя пользователя, пароль, имя сервера, порт и имя станции. У меня есть вся необходимая информация, хранящаяся в базе данных MySQL, и я могу легко получить это с помощью PHP.

Задача состоит в том, что NodeJS должен принимать сеанс PHP, проверяет его, извлекает необходимую информацию API из базы данных и устанавливает соединение с API.

Вопросы

Может nodejs использовать PHP сессии для проверки пользователя? Если да, то как?

Каким образом узлы могут использовать TCP-соединение, чтобы предотвратить перегрузку сервера?

+0

Вне темы, но мне интересно, поможет ли очередь сообщений решить проблему масштабируемости? – billrichards

+0

Также не по теме, но почему бы не убить TCP-соединения, когда они будут сделаны, если вы не используете их повторно?Или лучше, найдите способ сохранить соединение живым и попросите его повторно использовать его вместо того, чтобы создать новый? – Ghedipunk

+0

@Ghedipunk Я попытался добавить «Connection: Close» в мой запрос, но мой сервер Windows ищет в Wait_time в течение 60 секунд. Я не знаю, могу ли я контролировать, какое подключение tcp использовать. –

ответ

2

Это ваше расположение:

[User browser] -> [PHP] -> [Node.js] -> [API] 

Когда браузер вашего пользователя отправляет запрос на РНР сервер запрос содержит куки - один из значений этого печенья является session id, который PHP затем использует для поиска сессия. session id действует как пароль, PHP предполагает, что если у вас есть идентификатор сеанса, вы являетесь первоначальным пользователем, которому был выпущен этот идентификатор.

Когда ваш скрипт PHP связывается с узлом, ему необходимо передать этот идентификатор сеанса как часть запроса. В узле вам просто нужно выполнить поиск вашей таблицы сеансов в MySQL для соответствующего сеанса.

Данные сеанса PHP хранятся в виде массива $_SESSION. Чтобы извлечь данные из него, вам необходимо сначала выполнить его неэтериализацию. Существует несколько библиотек, которые могут обеспечить эту функциональность (например, https://github.com/naholyr/js-php-unserialize, https://github.com/kvz/phpjs/blob/master/functions/var/unserialize.js). Однако, если данные сеанса просты и соответствуют известному формату, вы можете «вручную разобрать» данные.

+0

Благодарю вас за помощь. Это происходит с тех пор. Теперь nodejs запрашивает таблицу сеансов при каждой загрузке страницы? Я не хочу продолжать звонить в таблицу сеансов, поэтому я хотел бы сделать это один раз для каждого пользователя. Кроме того, как я буду следить за моими «токенами CSFR», «Идентификатор сеанса» и «Http Cookie» после входа в API сеанса? мне нужен сервер websocket, а затем сервер node.js работает одновременно? –

+0

'будет nodejs запрашивать таблицу сеанса на каждой загрузке страницы' полностью зависит от того, как вы пишете свой код node.js! Что касается других переменных, похоже, вам нужно поддерживать сеанс в nodejs, но я думаю, что лучше всего открыть другой вопрос. – Eborbob

+0

Я немного смущен. так это значит, что мне все еще нужен веб-узел для связи между веб-браузером и приложением node.js, кто будет звонить в API и отслеживать сеанс пользователя? –

Смежные вопросы