【问题标题】:Is a -dynamic- PHP app more performant than a NodeJS one?-dynamic- PHP 应用程序是否比 NodeJS 应用程序性能更高?
【发布时间】:2021-07-30 19:15:15
【问题描述】:

我是 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 的生产环境中处理这种情况(如果有的话)?

【问题讨论】:

    标签: php node.js io event-loop nodejs-server


    【解决方案1】:

    你需要这样的非阻塞循环

    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 似乎是最适合你的用例

    【讨论】:

    • 据我了解,运行阻塞代码,即使在非阻塞代码中,仍然是阻塞的。例如,创建一个异步函数但在其中运行一个无限循环(如果为真),仍然会阻塞整个服务器。
    • 没错,但你需要一个非阻塞循环来不阻塞事件循环,并且使用 await / async 是我在 nodejs 中使用过的最有用的东西
    • 请允许我修正一下我的答案代码?
    • 请检查一下,我修好了
    猜你喜欢
    • 2016-05-03
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2015-11-20
    • 1970-01-01
    相关资源
    最近更新 更多