Javascript node.js或django是否像PHP一样“请求驱动”?

Javascript node.js或django是否像PHP一样“请求驱动”?,javascript,php,node.js,ajax,django,Javascript,Php,Node.js,Ajax,Django,老实说,我是一名Linux管理员,已经有几年没有做过web开发了。在过去的10多年里,我选择的工具是LAMP 我正在开发一个RESTAPI,我正在考虑进行分支。我知道用PHP做REST有很多方法,但也许这不再是最好的方法了 就我而言,PHP模型是这样的: 用户在浏览器或AJAX调用中发出请求 PHP被调用了。 PHP从顶部开始,按顺序从底部开始工作,连接到数据库,运行查询,做事情,输出数据。 请求已结束,用户已拥有数据并准备创建新数据。 对于PHP,每个请求都是一个新政。没有共享变量,您可以通过

老实说,我是一名Linux管理员,已经有几年没有做过web开发了。在过去的10多年里,我选择的工具是LAMP

我正在开发一个RESTAPI,我正在考虑进行分支。我知道用PHP做REST有很多方法,但也许这不再是最好的方法了

就我而言,PHP模型是这样的:

用户在浏览器或AJAX调用中发出请求 PHP被调用了。 PHP从顶部开始,按顺序从底部开始工作,连接到数据库,运行查询,做事情,输出数据。 请求已结束,用户已拥有数据并准备创建新数据。 对于PHP,每个请求都是一个新政。没有共享变量,您可以通过cookies\sessions传递信息,脚本完成后就可以传递了

在阅读节点的体系结构时,似乎一切都在这个单线程事件循环中运行。这是否意味着节点总是在运行,您可以在请求之间共享变量,或者每个请求都有一个新的事件循环?这是否意味着您可以编写草率的代码来阻止节点接受来自其他随机用户的新请求?Django的操作是否类似?如果是这种情况,是否可以为每个请求生成新的节点进程

这似乎有点危险。在PHP中,您可以编写草率的代码,导致单个请求运行缓慢,但在允许的情况下,每个请求都是独立的系统资源。我也喜欢PHP的do脚本和terminate特性,但这可能只是一种老派的思维方式


我将有一个电话应用程序\网站,它将数据来回传递到API,以从数据库获取信息,比如库存管理工具。我已经明确定义了API调用,前端开发人员只是根据需要调用它们。我有各种各样的调用来获取不同的数据位。

我不知道node,因为我只使用python,但我知道DJANGO是请求驱动的。请求驱动我认为这意味着您在声明视图函数时必须正确处理请求,否则会出现错误。
这不是有点太宽泛了吗?

所有代码都完全按照您描述的方式工作,因为这就是传统web的工作方式。请求导致响应。请求之间没有共享上下文。每个请求都在客户端上阻塞

它对PHP、Django和CGI时代以来的其他所有人都是如此

区别在于web服务器如何将这些请求委托给后端代码。你们这里有不同的型号;一些涉及多个线程,另一些涉及后端代码的多个进程

唯一始终运行的是web服务器或任何绑定到套接字的进程,该套接字在无限循环中侦听端口80。其他一切都在等待请求

节点是一个运行时环境;您通常使用框架(例如)开发在节点上运行的应用程序

如果您查看express的基本hello world,您会注意到它运行一个无限循环来侦听请求:

const express = require('express')
const app = express()

app.get('/', function (req, res) {
  res.send('Hello World!')
})

app.listen(3000, function () {
  console.log('Example app listening on port 3000!')
})
在节点世界中,有一个主事件循环,但所有i/o都发生在单独的非阻塞线程中

每个事件都放在一个队列上,主循环处理来自以下位置的队列映像中的内容:

因此,在编写节点应用程序时必须小心,因为如果您意外地编写了大量阻塞代码——这将对应用程序的其余部分产生严重影响——这与其他体系结构不同,在其他体系结构中,由于每个进程都是独立的,因此您可以避免一点马虎

在阅读节点的体系结构时,似乎一切都在这个单线程事件循环中运行。这是否意味着节点总是在运行,您可以在请求之间共享变量,或者每个请求都有一个新的事件循环

是的,node.js是一个始终运行的单线程。它是一个处理请求并发送响应的循环。与LAMP设置相比:node.js是apache和php的组合

这是否意味着您可以编写草率的代码来阻止节点接受来自其他随机用户的新请求

是的。您可以在请求之间共享状态,也可以阻止其他请求,更糟糕的是,您可以完全终止进程,或者向其他用户显示一些个人数据。使用node.js有很多方法可以让你一箭双雕。但另一方面,您可以在node.js中编写非常高效的应用程序,而且您不需要为每个请求重新启动整个应用程序,因此可以获得很多性能

这是否意味着您可以编写草率的代码来阻止节点接受来自其他随机用户的新请求

是的,试试这个:

const express = require('express')
const app = express()

app.get('/', function (req, res) {
    while(true){
    }
  res.send('Hello World!')
})
app.get('/ok', function (req, res) {
  res.send('ok!')
})

app.listen(3000, function () {
  console.log('Example app listening on port 3000!')
})
进入/好的,没什么大不了的。然后access/不会给你任何回复,然后在另一个选项卡access/再次确认,你不能。节点仍在/的循环中,阻止了其他用户

< p> 显而易见的解决方案是不要编写草率的代码,但由于您提到刚开始,这可能会让您有些焦虑。IE:你可能不知道什么是好的或坏的。我认为这在任何语言中都是一样的

所以,正如您所问的,您可以在多个进程中运行它吗?对

要做到这一点,我想你的想象力是有限的。例如,如果您的应用程序没有您提到的REST状态,您可以运行多个服务器,每个服务器在不同的端口上侦听,并将每个请求路由到单个服务器


还有一个,虽然我不使用它,但我想这就是它的作用。

我不确定这个词是否正确,但当我说请求驱动时,我的意思是每个HTTP请求都调用一个脚本来完成它的任务,并像PHP一样终止。每个请求都是独立的,在资源允许的情况下,它们无法相互拼凑。我假设每个请求调用一个新的django线程\进程,就像Apache对PHP所做的那样?我认为node是围绕一个架构设计的,它只是坐在那里,不断地侦听,从未真正“终止”,但我可能错了。DJANGO是充当web服务器还是在NGINX\Apahe后面?可能节点不同,因为节点是web服务器?使用PHP,Apache或NGINX运行、处理请求并将它们分发给PHP。PHP不是web服务器,也不能真正处理请求。脚本被调用,就这样。我想Django也是这样的,因为你提到了。使用node时,node既是web服务器又运行实际代码。感谢您的编辑。所以看起来node实际上是web服务器和应用程序。这意味着您可以在技术上使用全局变量来设置状态并持久化多个请求。这是一种完全不同的思维方式,做一件事,返回结果,就是这样。您可以编写阻止整个web服务器的代码。在PHP中,您不能真正做到这一点。这是一种完全不同的思维方式。w\node似乎很容易陷入麻烦,特别是当您有多个工作人员在处理它时。想象一下内存中的队列之类的东西。我不习惯将web应用程序视为单个程序,而是将脚本集合在web服务器后面。这种节点架构是人们思考web应用程序\API的新方式,还是web服务器PHP、Django背后的CGI仍然同样有效?CGI方法肯定仍然同样有效。这实际上取决于您的用例。Node非常适用于实时应用程序,如果您决定将应用程序拆分为多个可独立扩展的应用程序,Node也非常适用于快速微服务等。Google Node.js的优缺点,您会发现很多。。。