Nodejs是否可以validationPHP用户的会话?

请随身携带,因为这是一个很长的问题,但有很多细节来解释我的问题。

我在做什么?

我正在尝试在PHP应用程序和电话系统的REST API之间build立通信。

由于我的网站都是用PHP编写的,所以我决定用cURL调用API来构build使用PHP的通信。

为了让你加快速度,用户和API之间有两种types的通信,我喜欢把它们分成两个不同的类别

  • 发送一次/接收一次这将是一个例子,用户尝试拨打一个新的电话号码“拨打800-123-4567”。 API接收请求并返回一个交互ID,以允许用户控制呼叫(即,断开,静音,搁置….)
  • 每秒发送一次/接收在此通信中,我将在用户会话和API之间创build“持续”连接。 然后,每隔一秒,我会检查API的新消息。 在接收到来自API的消息之后,我必须更新用户的caching,读取最新用户的caching,并最终向浏览器发送caching数据。

问题? HTTP是无状态的。

用户发送给Web服务器的每个请求都会生成一个新的TCP连接。 这个问题是,我每秒查询API的新消息,我将有一个新的TCP连接。 在每个用户的任何给定时间平均需要约200个TCP连接。 所以,如果我有300个用户使用应用程序/服务器,那么大约有60,000个TCP连接为Web服务器打开。 正如你可以清楚地看到解决scheme在这里不能很好地扩展,服务器在我面前爆炸是一个时间问题… 🙁

另一个问题是PHP不是asynchronous的,如果与API的通信花费更长时间或返回错误,则会导致问题。

FWIW,我试图用JavaScript的SharedWorker来消除一些开销。 我每一个尝试服务器发送事件,但用户仍然产生了太多的TCP连接到服务器。 没有什么第一个问题,我只能够减less一点连接。

Nodejs可以帮忙吗?

几个人build议我使用Nodejs而不是PHP来完成这个任务。 当然,我不打算把我的PHP应用程序改成Nodejs,因为这是疯狂的,因为我的应用程序是巨大的。

我想考虑运行一个nodejs服务器作为PHP服务器和API服务之间的中间人。 这个想法是在节点服务器上运行一个WebSocket。 然后,客户端将任何通信传递给WebSocket,然后WebSocket将通信发送到服务器。 这听起来不错,但是一旦深入挖掘,似乎越来越棘手。

Nodejs的挑战

当用户login到我的PHP应用程序,我validation他们的凭据,一旦他们在那我创build一个存储到MySQL数据库的会话。 一个会话是有效的以下必须是正确的

  • IP地址必须与创build会话的IP相匹配
  • 代理数据也必须匹配(我可以没有它的nodejs)
  • 会话的空闲时间必须less于900秒。

为了Nodejs开始通信,它必须首先创build一个新的连接到API。 连接被接受后,nodejs必须跟踪“接收到的API”的下列数据

  1. CSFR令牌
  2. 会话ID
  3. Http Cookie

为了Nodejs连接到API,它必须通过用户名,密码,服务器名称,端口和站名。 我有所有需要的信息存储到MySQL数据库,我可以很容易地得到使用PHP。

面临的挑战是NodeJS必须采取PHP会话,validation它,从数据库中提取API所需的信息,然后build立与API的连接。

问题

nodejs可以使用PHP会话来validation用户吗? 如果这样怎么样?

nodejs如何使用TCP连接来防止我重载服务器?

这是你的安排:

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

当用户的浏览器向PHP服务器发送一个请求时,请求中会包含一个cookie–这个cookie的其中一个值就是PHP用来查找session idsession id作用就像一个密码,PHP会假设,如果你有会话ID,那么你是原来的用户,是发出的ID。

当您的PHP脚本与节点通信时,它需要传递该会话ID作为请求的一部分。 在Node中,您只需要在MySQL中查看您的会话表以查看相应的会话。

PHP会话数据被存储为序列化的$_SESSION数组。 要从中提取数据,您需要首先对其进行反序列化。 有一些库可以提供这种function(例如https://github.com/naholyr/js-php-unserialize,https://github.com/kvz/phpjs/blob/master/functions/var/ unserialize.js )。 但是,如果会话数据很简单并符合已知格式,则可以“手动分析”数据。