我在做什么?
我正在尝试在PHP应用程序和电话系统的REST API之间建立通信。
由于我的网站都是用PHP编写的,所以我决定通过对API进行cURL调用来使用PHP构建通信。
为了让您快速,用户和API之间有两种类型的通信,我喜欢将它们分为两个不同的类别
问题? HTTP是无状态的。
用户发送到Web服务器的每个请求都会生成一个新的TCP连接。这个问题是我每秒都会查询API以获得新的消息,我会有一个新的TCP连接。每个用户在任何给定时间平均需要大约200个TCP连接。因此,如果我有300个用户使用应用程序/服务器,那么这是为Web服务器打开的大约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 App时,我会验证他们的凭据,一旦他们进入,我就会创建一个存储在MySQL数据库中的会话。要使以下内容有效的会话必须正确
为了让Nodej开始通信,它必须首先创建一个到API的新连接。接受连接后,nodejs必须跟踪API接收的以下数据"
为了使Nodej与API建立连接,它必须传递用户名,密码,服务器名称,端口和站名。我将所有需要的信息存储到MySQL数据库中,我可以使用PHP轻松获得。
挑战在于NodeJS必须接受PHP会话,对其进行验证,从数据库中提取所需的API信息,然后建立与API的连接。
问题
nodejs可以使用PHP会话来验证用户吗?如果是这样的话?
nodejs如何使用TCP连接来阻止我超载服务器?
答案 0 :(得分:2)
这是你的安排:
[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)。但是,如果会话数据很简单并且符合已知格式,您可以“手动解析”数据。