浅谈nodejs与php设计构思层面上的差异

2019-08-14 14:33:43

nodejs最近火的一塌糊涂,那为什么它可以成为千百程序员的新宠呢?


难道只是因为把js搬到了服务端?如果仅仅是这样是迁移了一个运行环境和增加几个模块的话我想完全不可能会得到喜新厌旧的程序员的青睐


nodejs和php的差异主要是两个方面:分工和运行机制


分工:nodejs直接跳过了服务器这个阶段,把创建服务器作为node的一个模块,监听请求这些应该是服务器做的工作现在变成了node做,这样就简化的开发环境,而且更加容易控制监听请求以及响应.也就是说node没有一个web容器,没有根目录的概念。


运行机制:


php在处理并发的时候是通过多线程处理,这样会导致硬件成本的增加,特别是一些频繁I/0的项目,很多的线程被阻塞,cpu得不到充分的利用。


node:node的核心理念是单线程,通过事件和回调实现并发。既然是单线程,那硬件成本自然比较低。


那单线程怎么实现并发呢?我认为正是这种实现的方法让大家耳目一新,所以才会让node如此的火,


并发实现原理:比如一百个请求要做一百件事,当第一个请求执行到i/o的时候立马挂起,不等待i/o成功,直接执行下一个事件,直到i/o完毕,这是触发回调事件,回调事件的优先级会比普通事件的优先级高,就是这样通过异步来实现单线程的并发处理。保证了线程永远有事做,不会等待


缺点:这样是提高了cup的利用率,但是无疑是把所有鸡蛋放在一个篮子里面,如果有个事件导致线程蹦了,直接的后果就是导致线程上的所有任务事件都蹦了,还有如果是运算的阻塞是没法并发的,所以这就局限了它只是适合做大量i/o的应用场景,不适合做大量计算的项目,例如股票这类型的。


node还有一个很大的特点就是路由功能,需要自己去配置,应为没有服务器软件,所以服务器软件的所有功能都需要自己去写,但是常用的功能在开源社区基本都已经有人写好了,对于我这样的喳喳来说简直就是福音啊。


以上笔记单纯代表个人观点,有不同意见的欢迎打搅。



  • 2018-04-03 10:22:20

    JQuery如何监听DIV内容变化

    这几天在做一个微博的接入,需要判断微博是否被关注,要检查微博标签的DIV是否有“已关注”的字符,但这个DIV的内容是微博JSSDK动态生成。$("#id").html()是获取不到我想要的内容。原因是当我们获取的时候内容还没有改变,所以获取不到,如果就想到监听这个DIV内容变化后,再来获取就个时候就能获取到了。于是产生新的问题,如何监听DIV的变化?

  • 2018-04-04 23:52:03

    PowerManager之PowerManager

    当你在做一些事情时,如果持续时间过长,那么一段时间后屏幕会灭掉,如果你想在你做这些事时屏幕始终保持点亮状态,那么你需要WakeLock的帮助。

  • 2018-04-07 23:35:16

    使用Intent传递对象的两种方式

    Intent 的用法相信你已经比较熟悉了,我们可以借助它来启动活动、发送广播、启动服务等。在进行上述操作的时候,我们还可以在Intent 中添加一些附加数据,以达到传值的效果,比如在FirstActivity 中添加如下代码:

  • 2018-04-10 14:59:59

    JS实现数组去重方法总结(六种方法)

    这篇文章给大家总结下JS实现数组去重方法(六种方法),面试中也经常会遇到这个问题。文中给大家引申的还有合并数组并去重的方法,感兴趣的朋友跟随脚本之家小编一起学习吧

  • 2018-04-13 17:28:33

    jsoup 使用总结4--高级用法之 script js 脚本

    大部分时候,我们使用jsoup解析网页的时候,都是直接找到某一类元素,或者按某种selector查询;具体使用方法可以参考jsoup官网文档 那么你有没有实际操作过,查找script js 脚本呢,因为很多时候页面的内容是根据js动态生成的,或者数据是动态变更;那么这个时候,我们只是获取html页面中script js脚本之间的内容。

  • 2018-04-15 12:56:05

    WebView控件之WebSettings各种配置方法源码总结

    WebSettings用于管理WebView状态配置,当WebView第一次被创建时,WebView包含着一个默认的配置,这些默认的配置将通过get方法返回,通过WebView中的getSettings方法获得一个WebSettings对象,如果一个WebView被销毁,在WebSettings中所有回调方法将抛出IllegalStateException异常。