-dynamic- PHP 应用程序是否比 NodeJS 应用程序性能更高?

问题描述

我是 NodeJS 的新手,主要来自 PHP,并且正在构建一个应用程序,该应用程序需要在每次请求时从服务器提供新的 HTML 服务 - Node 使用 EJS 模板引擎提供 HTML - 没有 SPA 框架。我偶然发现了一个案例,由于服务器 I/O 操作,我不确定是 PHP 还是 Node 最合适。

我的应用程序的整个请求过程是完全异步的。所有 DB (Mongo) 调用、readFiles、EJS 渲染和包含等。重点是所有可以异步的代码都是异步的,不会阻塞事件循环和服务器 I/O 操作。

但是,我的应用程序需要提供和呈现大量特定于用户的动态数据,并且呈现必须是同步的。该应用程序是一个具有许多页面和选项的客户管理系统,在任何给定点都会同时有几十个登录用户,每个用户都需要有与他们相关的数据(因此完全缓存 HTML 并不是真的一个选项)。

例如,如果我从数据库获取 1,000 个项目的列表,并且需要运行常规 for 循环来呈现它(使用或不使用 EJS)。就我的理解而言,for 循环是完全阻塞的。即使处理 1,000 个项目非常快速和简单,它仍然会阻塞。如果真的有很多渲染与阻塞服务器的 for 循环等简单逻辑有关,这显然是有问题的。

这是一段代码来说明我在说什么:

const arr = new Array(1000);
let ul = '<ul>';

for(var i = 0; i < arr.length; i++){
    ul += `<li>Item #${i}</li>`;
}

ul += '</ul>
res.end(ul);

上面这个简单的例子,渲染一个简单的 UL,不管它是快还是慢(取决于将在数组中的数据)都会阻塞所有用户的整个服务器。

我想这与许多用户同时请求页面的电子商务应用程序相同。这样的应用程序使用 PHP 而不是 Node 的性能会更高,因为使用 PHP 运行简单的逻辑,不管数据集有多大(大部分),只是不会阻止服务器为其他用户提供服务?或者我在 NodeJS 方面遗漏了什么?在使用 NodeJS 的生产环境中,您将如何处理这种情况(如果有的话)?

解决方法

你需要一个像这样的非阻塞循环

const arr = []
let arrayLength = 3

let ul = ""
const Loop = async (i) => {
ul += `<ul>\n`
ul += `<li>Item #${i}</li>\n`
ul += `</ul>\n`
   if (i >= arrayLength - 1) {
    //Finished loop do whatever.
    console.log(ul)//Output
    return true
   }

    // "Asynchronous recursion".
    // Schedule next operation asynchronously.
    setImmediate(Loop.bind(null,i + 1))
}
Loop(0)

输出:

<ul>
<li>Item #0</li>
</ul>
<ul>
<li>Item #1</li>
</ul>
<ul>
<li>Item #2</li>
</ul>

这样您就可以为所有人服务,而不会阻止任何人的请求

事实上,Nodejs 似乎是最适合您的用例