首页 > 后端开发 > php教程 > PHP 和 Go 作为技术堆栈。

PHP 和 Go 作为技术堆栈。

Linda Hamilton
发布: 2024-12-29 05:30:14
原创
872 人浏览过

首先,让我先谈谈为什么我比其他著名的 JAVASCRIPT 技术堆栈更喜欢它的所有原因。

  • 我讨厌“Javascript 无所不能”的趋势.. 是的.. Javascript 在这一点上几乎可以做任何事情.. BUTT,这样做有效吗?

  • 让我们举一个非常密集的 CPU 密集型任务的示例。这是模拟 CPU 密集型任务的代码示例。让我们看看 Javascript 是如何执行的。

原因 1:Javascript 在处理 CPU 密集型任务时表现不佳!

setTimeout(function() {
    console.log("Hello world")
}, 1000)

const startTime = Date.now();
while (Date.now() - startTime < 3000) {} //Simulating a long CPU intensive main thread task..

console.log("End")

登录后复制
  • 那么,我们这里有什么?我,作为 JAVASCRIPT 的用户,希望在 1 秒后看到“hello world”打印出来......你猜怎么着。事实并非如此。 3秒后它会吐出“hello world”..

  • 为什么会发生这种情况?为了理解这一点,我们需要了解浏览器和 Node js 中的事件循环是如何工作的。简单来说,事件循环同时检查调用堆栈和回调队列。一旦计时器完成 1000ms,我们传入 setTimeout() 的回调函数就会进入回调队列。

  • 但是你猜怎么着...当计时器完成工作时,调用堆栈不为空..它仍然忙于执行我们编写的 3 秒 CPU 密集型任务(是的..它是一个模拟..不是一个现实世界中的愚蠢程序,需要 3 秒才能完成其打算做的任何事情)。

  • 所以,回调队列和微任务队列中的回调函数将会挨饿。. 糟糕的回调函数。他们只有在 3 秒后才有机会进入调用堆栈。这就是为什么我们看到“hello world”在 3 秒后被打印出来,即使我指定了 1000 毫秒。

PHP and Go as a Tech Stack.

是的。这是我从网上下载的事件循环的随机图像。很酷的图像。

让我们使用一个执行相同操作的 Go 代码..

package main

import (
    "fmt"
    "time"
)

func main() {
    time.AfterFunc(1*time.Second, func() {
        fmt.Println("Hello world")
    })

    // Simulating a long CPU-intensive main thread task
    startTime := time.Now()
    for time.Since(startTime) < 3*time.Second {
    }

    print("End")
}

登录后复制

这里,“hello world”在 1 秒后被打印出来..如何?因为 AfterFunc() 运行在它自己的 GoRoutine 上,它与主 GoRoutine 没有任何关系..

原因2:我个人讨厌客户端渲染。

  • 我们来谈谈reactJS。它将 javascript 组件推送到客户端,并用很多东西塞住客户端的喉咙,以至于客户端开始节流..

  • 想象一下,一台低端 PC 请求一些静态 HTML 文件,然后你会得到一堆 React 组件的垃圾。客户端会有什么感觉?它变得很慢..浏览器必须解析 javascript,执行虚拟 DOM,从中生成 HTML..还有什么..

  • 浏览器正在完成服务器必须做的所有工作..

  • 还记得网络的自然流动吗?

  • 先加载 HTML,然后才加载 javascript?为什么?为了使初始绘制尽可能快..还记得我们在 HTML 文档页脚中加载 javascript 的日子吗?

  • React 只是让整个流程颠倒了。

  • 结果,客户必须长时间盯着空白屏幕..

原因都说了..

  • 我正在选择两种在自己的世界中闪耀的语言..

  • 最让我印象深刻的是,Go 是一种编译语言,而且是静态类型的.. 你可以盲目地说,Go 超级快,比 javascript 快很多..

  • 它有内置的轻量级线程,称为“GoRoutines”,它比实际操作系统线程快得多,因为 Go 线程是轻量级的。

  • Go 可用于构建 RESTful 端点或可用于任何后端服务..

  • 但是,我不能使用 Go 进行 SSR。PHP 的亮点就在于此。在我的堆栈中,Go 将大量用于 CPU 密集型 API 或任何后端服务。

PHP

  • PHP 是我用过的最好的 SSR 工具。简单且非常直接。为每个客户端创建一个进程..使得速度有点慢。但这些进程仍然是彼此独立的,不像线程共享相同的进程内存空间,并且不利于竞争条件和许多其他线程相关的问题..

  • 在我看来,PHP 也与 Web 紧密耦合。直接开箱即用的超级全局变量,如 $_GET、$_SERVER 等...这使得一般情况下使用 Web 变得更容易。

  • PHP 中的会话管理太好了.. 语言本身自带.. 并且管理会话太容易了..

结论:

  • PHP 可以纯粹用于 SSR。和会话管理。我不能相信 PHP 可以完成 CPU 密集型任务,因为它很糟糕。为什么?它是一种解释性语言,而且也不是多线程的..

  • 因此,我将所有 CPU 密集型调用卸载给 Go。

  • 两个世界中最好的.. PHP 用于 SSR,这样客户端就不会受苦,并且可以执行 CPU 密集型任务,因为它可以很好地实现并发...

以上是PHP 和 Go 作为技术堆栈。的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板