Nodejs 可以验证 PHP 用户的会话吗?



我在做什么?

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

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

让你快速了解一下,用户和API之间有两种类型的通信我想把它们分为两个不同的类别

  • 发送一次/接收一次示例如下:用户尝试拨打一个新的电话号码"dial 800-123-4567"。API接受请求并返回一个交互id,以允许用户控制调用(即断开连接、静音、保持....)。
  • 每秒钟发送一次/接收一次在此通信中,我将在用户会话和API之间创建"持久"连接。然后,每隔一秒钟,我将检查API是否有新消息。在收到来自API的消息后,我必须更新用户的缓存,读取最新用户的缓存,最后将缓存数据发送给浏览器。

问题? HTTP是无状态的

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

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

顺便说一句,我已经尝试使用JavaScript SharedWorker来消除一些开销。我尝试过服务器发送事件,但用户仍然生成了太多到服务器的TCP连接。

Nodejs可以帮助吗?

我被几个人建议使用Nodejs而不是PHP来完成这项任务。当然,我不会把我的PHP应用程序改成Nodejs,因为这太疯狂了,因为我的应用程序太大了。

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

<

Nodejs挑战/strong>

当一个用户登录到我的PHP应用程序,我验证他们的凭据,一旦他们在然后我创建一个会话存储到MySQL数据库。要使会话有效,以下内容必须正确

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

为了让Nodejs开始通信,它必须首先创建一个到API的新连接。在接受连接后,nodejs必须跟踪以下"API接收到的"数据

    <
  1. CSFR令牌/gh>
  2. 会话Id
  3. Http Cookie

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

挑战在于NodeJS必须接受PHP会话,验证它,从数据库中提取API所需的信息,然后建立与API的连接。

nodejs可以使用PHP会话来验证用户吗?如果有,那是怎么回事?

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

这是你的安排:

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

当用户的浏览器向PHP服务器发送请求时,请求包含一个cookie -该cookie的值之一是session id, PHP然后使用它来查找会话。session id就像密码一样,PHP会认为如果你有会话id,那么你就是发出该id的原始用户。

当您的PHP脚本与Node通信时,它需要将会话id作为请求的一部分传递。在Node中,你只需要在MySQL中查找相应会话的会话表。

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

相关内容

  • 没有找到相关文章

最新更新