分类 大话编程 发布 ourjs 9/14/2013 原文 cnodejs.org
注意 转载须保留原文链接,译文链接,作者译者等信息。
当搜索Node.js与PHP比较时,总能找到Jani Hartikainen写的PHP优于Node.js的五大理由,这也让勇于挑战新事物新技术的同学犹豫不前,这里也让多年在WEB领域耕耘的码农谈谈不同看法。
1. 容易托管
我想作者肯定指的是空间吧?那是上个世纪的事物了吧。现在是什么?小的说是平台,大的说是云计算。
是的,2003年我用asp写网站的时候,对于我而言服务器,内存是极其昂贵的,那个时候一定需要服务器空间需要FTP软件,做一个asp(2003更多的是asp空间商吧!)网站,通过FTP上传,现在还有做网站上传空间吗,现在几乎都是云平台,服务器租赁,至少也是虚拟空间,
2. PHP在服务器上安装更方便、简易
很多同学都在问node.js在服务器怎么启动?为什么?因为node.js 相对于php的启动太简单了,甚至简单到不可想象,只需要一个node app.js(入口文件)就可以,而php需要选择哪一个http服务器,当然你可以选择php的黄金搭档apache,如果不是默认的配置,你对apache的了解又有多少,又有多少php程序员知不知道php依赖于fastcgi,一个服务器的配置对于开多少fagcgi进程是合理的?
3. 如果PHP代码损坏,不会拖垮整个服务器,4. PHP进程短暂
这两点我要放在一起说,为什么?因为这正是node.js最大的优势。
坦率地讲PHP与node.js根本没有比较性而言,争的是什么?是HTTP SERVER之争。PHP的黄金搭档是apache?不,还少一个FastCgi,node.js和php的比较,是node.js与php+apache+fastcgi的比较,简单地讲FastCgi就是多线程的Cgi(当然有线程池),当每一个PHP请求,都会产生一个新的线程,每个线程都是独立的,线程不会影响另外的线程,那么这就形成PHP的两个特点,相对的稳定,相对的并发。为什么是相对的稳定和相对的并发?相对的稳定的是一个进程的崩溃不会影响另外一个进程(因为肯定是一个请求的代码出现问题造成的崩溃,但一个崩溃不影响其它我们就可以视而不见?),相对的并发是如果一个服务器可以开250个线程,再加上线程池就可以保证一定的并发量。
但是,线程是什么?是OS执行的最小单元,由线程ID,当前指令指针(PC),寄存器集合和堆栈组成(是不是专业的都要背?),然而线程是昂贵的,线程对cpu和内存的占用都是很重的,就象一个人跑步一样,你加速了,停下,启动再加速,那是很费力的。这就使得HTTP SERVER的后起之秀nginx以光的速度蔓延开来,nginx就是以单线程为基础的,为什么nginx快?WEB的世界是可以通过木桶效应来论述,也就是一次请求最短的木板就是瓶颈,很多人认为运算处理会阻塞主线程,这是需要由测试和经验来决定的,事实是它的处理时间占用很短,做100万次for循环要比一次网络访问的时间还要短,这些操作包括网络访问,I/O操作,数据库访问。nginx进程模型是所有需要阻塞请求的部分全部由epool(事件通知接口)触发相应事件,非阻塞(处理耗时 很短)部分用主线程一直执行,直到遇到阻塞部分就停止,交由阻塞部分监听异步完成事件,这样就构成了事件驱动模型。这部分可以研究一下nginx进程就可以得知。
说到这里,大家是不是觉得node.js与nginx进程模型很象,是的!这就是node.js创始人Ryan Dahl的初衷,单线程,事件模型。
node.js就是基于单线程和事件模块,这也恰恰是Javascript特性(所以最终Ryan Dahl选择Javascript是必然),node.js的单线程就是主线程,主线程是什么?就是事件队列,node.js(Javascript)就是面向事件驱动的编程,web是事件化的,os也是事件化的。os的服务(I/O,database)都是在自己独立的进程中完成,当发生一个请求后,node.js只是在这个事件队列中注册一个事件,然后就不管了,具体这个事件的执行就交给了os(i/o,database)不同的进程,等os完成后,通过回调(node.js会轮询)再回到主线程的处理,所以node.js单线程是指自己的主线程,而不是所有的操作都是在这个线程里,这个线程只是事件调度,事件的执行都是交给操作系统在其它的线程中完成。所以node.js是非I/O阻塞,而不是非cpu阻塞,那么node.js会出现cpu阻塞,是不是性能就会有问题呢?不是的,就象Nginx一样,因为对web而言运算是非常非常小的,一次I/O的操作的时间远大于你做百万次的for循环。
5.更大的标准库
没有选择是最容易的,就以前我一直用微软的工具一样。其实对于库而言,应该是一些重要的库是不是还在更新和进步,至少在node.js发展了这么多年,对我而言对重要的web所必要的模块已经足够强壮。
另外补充:
Javascript
天时,地利,人和!Javascript的出现就是天时,Javascript就是为web而生,Javascript就是因为web而不断成熟,看语言的排名,一切都是浮云,武功最高的境界就是无剑胜有剑,所有的c#,java php程序肯定都用过Javascript吧,但真正对Javascript了解又有多少?只是把Javascript当作效果工具了吧?
回调
回调真的恶心吗?当你真的理解事件驱动的时候,你会发现回归才是编程的本质,一切的结束都是回归,而不是强求!