Пожалуйста, со мной, поскольку это длинный вопрос, но есть много деталей, чтобы объяснить мою проблему.Может ли 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"
- CSFR маркер
- Id Session
- Http Cookie
для того, чтобы Nodejs сделать соединение с API должно передавать имя пользователя, пароль, имя сервера, порт и имя станции. У меня есть вся необходимая информация, хранящаяся в базе данных MySQL, и я могу легко получить это с помощью PHP.
Задача состоит в том, что NodeJS должен принимать сеанс PHP, проверяет его, извлекает необходимую информацию API из базы данных и устанавливает соединение с API.
Вопросы
Может nodejs использовать PHP сессии для проверки пользователя? Если да, то как?
Каким образом узлы могут использовать TCP-соединение, чтобы предотвратить перегрузку сервера?
Вне темы, но мне интересно, поможет ли очередь сообщений решить проблему масштабируемости? – billrichards
Также не по теме, но почему бы не убить TCP-соединения, когда они будут сделаны, если вы не используете их повторно?Или лучше, найдите способ сохранить соединение живым и попросите его повторно использовать его вместо того, чтобы создать новый? – Ghedipunk
@Ghedipunk Я попытался добавить «Connection: Close» в мой запрос, но мой сервер Windows ищет в Wait_time в течение 60 секунд. Я не знаю, могу ли я контролировать, какое подключение tcp использовать. –