PHP vs Node.js 已翻译 100%
网络正在处于一个日新月异的发展时代。服务器端开发人员在选择语言的时候非常困惑,有长期占主导地位的语言,例如C、Java和Perl,也有专注于web开发的语言,例如Ruby、Clojure和Go。只要你的项目运行良好,你的选择就显得没有那么重要了。
但是如何让这些新的web开发人员做出一个正确的选择呢?
我不希望展开一场PHP、NodeJs两大阵营之间的战争,我将会对比这两种语言所在领域的发展状况:
PHP
Rasmus Lerdorf在1994年创造出了PHP。它是由安装在web服务器(Apache、Ngix)上的组件运行的。PHP代码可以和HTML混合到一块。 对于初学者就能很快写出很有价值的代码,这并不需要太多的练习。 这让PHP变得越来越流行, 现在全球百分之八十的服务器上都在运行着PHP。全球四分之一的网站都在用的一个内容管理系统--WordPress,就是用PHP写的。
Node.js
Ryan Dahl在2009年创造了Node.js。它是基于Google的V8 JavaScript解释引擎(在Chrome浏览器里它负责执行客户端的JavaScript代码)。与其它语言不同的是Node.js内置了处理网络请求和响应的函数库,所以你不需要单独的服务器(Apache、Ngix)或者其他依赖。Node.js虽然很新但是很快就获得了极大的追捧。在很多的大公司都有在使用,例如:Microsoft,Yahoo,LinkedIn和PayPal。
我们所钟爱的C#、Java、Ruby、Python、Perl、Erlang、C++、Go、Dart、Scala、Haskell等等,它们呢?
如果文章里边比较了如上所有语言的各种参数,文章将会非常长,你还会读它么?你期望一个程序员了解所有的程序开发语言吗?这显然是不可能的。我主要对PHP和Node.js做了比较,主要原因如下:
首先它们之间值得比较。两者都是开放源码,都是致力于web开发,并且都可用于相似的项目。
PHP已经发布了很久了,但是Node.js才刚刚兴起,并受到越来越多的关注。难道PHP的程序员应该相信Node.js的宣传?应该考虑转换语言?
我了解,热爱编程语言,自从20世纪90年代之后我就一直使用PHP和JavaScript,并且也有几年的Node.js的经验。除此之外我也涉猎了其他的技术,但是在这里我还不能对他们作出客观评价。
另外,对多少语言做比较不重要,因为总会有某些地方的某些人抱怨我没有提到他们语言。
SitePoint上的角逐
程序员会花费很多时间来提升他们自己的编程能力。一些人有编程语言之间的延伸能力,但是这些达到更高层次的人根据很多的因素来做出他们自己的选择。从主观方面来说,你将会推进并且捍卫你的技术决策。
SitePoint Smackdowns并没有采取“选择适合你自己的,朋友”这样的观点。我将会根据个人的经验、要求和喜好提出建议。你可能不会同意所有的我所说的所有观点,这并不重要,重要的是你的意见将会给其他人做出更加明智的选择。

评估方法
下面将会对 PHP 和 Node.js 进行十个轮次的比较。每个回合都会考量可以应用到任意 web 技术的常见的开发挑战。我们不会太深入讨论细节;很少有人会关心随机数生成器或数组排序的价值。
赢得最多回合的将会是优胜者。准备好了吗?开始较量吧。。。。。。
第一轮:起步
创建一个“Hello World” web 页面有多快呢?在 PHP 中:
<?php echo 'Hello World!'; ?>
这段代码可以放置在可以被 PHP 引擎解析的任意文件中——通常,是以 .php 为后缀的文件。在浏览器中输入 URL 跳转到文件即可。
不可否认,这不是全部。这段代码只能运行于安装了 PHP 的 web 服务器(PHP 有一个内置的服务器,尽管如此,最好还是使用一个更健壮的服务器)。大多数操作系统提供了服务器软件,如 windows 上的 IIS,Mac 和 Linux 上的 Apache,尽管它们需要启动和配置。通常使用提前构建的安装程序,如 XAMPP 或虚拟机镜像(如 Vagrant)。一种更简单的方式:上传你的文件到任意的 web 主机。
对比而言,安装 Node.js 轻而易举。你可以 下载安装程序 或者 使用包管理器。 接下来让我们在 hello.js 中创建 web 页面:
var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World!'); }).listen(3000, '127.0.0.1');
在浏览器中访问 http://127.0.0.1:3000/ 之前,你需要在终端输入 node hello.js 来启动应用程序 。通过上面的五行代码,我们已经创建了一个小型的 web 服务器,尽管这很令人吃惊,但是即便拥有很强客户端 JavaScript 经验的人也很难理解。

PHP 在概念上更简单所以赢得本轮。稍微懂得一些 PHP 声明的人就可以开发一些有用的东西。PHP 有更多的软件依赖,但是 PHP 的概念对于新手来说不那么繁琐。
懂一些 JavaScript 和开发 Node.js 应用是两回事儿,Node.js 开发方法和大多数服务端技术不同,你需要先弄明白一些相当复杂的概念,比如关闭和回调函数。
第二轮:帮助和支持
没有官方文档和资源(课程,论坛,堆栈溢出)的帮助你必将举步维艰。 PHP 在本轮轻易胜出,她有大量的指南和二十年的 Q&A。无论你想做什么,总会有人在你之前已经面对过同样的问题。
Node.js 拥有很好的文档,但是更加年轻,能提供的帮助较 PHP 也少。JavaScript 在市面上的时间和 PHP 一样久,但是主要的帮助都是针对浏览器开发的,那基本没啥帮助。
第三回合: 语言语法
声明与结构是不是符合逻辑而且简单好用?
不像一些语言跟框架,PHP 不会限制你按特定的方式编写,具体怎么搞随你。你可以从几行的程序开始,然后添加些方法,进而写一些简单的 PHP4 模式的对象,最后编写优雅的面向对象的 MVC 模式 PHP5+ 的应用。你的代码开始可能比较混乱,但也能工作,而且会随着理解的深入越写越好。
PHP 的语法在版本间可能略有调整,但是向后兼容一般都做得很好。但不幸的是,这也导致了一个问题:PHP 很混乱。例如,怎么统计一个字符串中字符的个数?是 count?str_len? 还是 strlen?亦或 mb_strlen?PHP 有数以百记的函数,而且命名规则也也不完全一致。可以试试不查文档写几行代码。
JavaScript 相对就简单些,只有几十个核心声明。不过语法就经常被开发者喷了,因为它的原型化对象模型看起来平易近人,实际上却不是。而且各种数学错误(0.1+0.2 != 0.3)以及类型转换的混乱('4' + 2 == '42' 和 '4' - 2 == 2)也招致不少抱怨,但这些情况世界很少导致什么问题,多数语言都有这种借口。
PHP 有他的优点,但是这回合我判 Node.js 胜。理由如下:
JavaScript 是世界上最难理解的语言 — 但是,当哪天你顿悟以后,概念一通,就会发现其他语言都太过笨拙了。
JavaScript 代码比 PHP 简洁。例如,你再不需要跟 JSON 转来转去—— UTF-8 也不用
全栈工程师可以同时在客户端与服务端使用 JavaScript 。大脑不需要来回切换。
深入理解 JavaScript 会让你更想用它,但是 PHP 不是这样。

第四轮:开发工具
两种技术都有一些很好的编辑器,集成开发环境,调试器,验证器和其他工具。我认为这是平局,但是这里有一些工具给 Node.js 些许优势:NPM-包管理器。 NPM 允许你安装和管理依赖,设置配置变量,定义脚本和其他。
PHP 的 Composer 项目受 NPM 激发,在有些方面更强。但是,PHP 在默认情况想不提供,活动库较小,在社区的影响更小。
Grunt 和 Gulp 之类革新了开发方法的构建工具的壮大,NPM 也有一部分功劳。有时候 PHP 开发者也许想要/需要安装 node.js,这不是倒退。
第五轮:环境
技术可以在哪使用和部署?支持哪些平台和生态系统?网页开发者经常需要开发一些并不完全针对网页的应用,比如构建工具,迁移工具,数据库转换脚本等。
PHP 有办法开发桌面应用和命令行工具,但是你不会使用他们。本质上,PHP 是一个服务端技术,他很擅长该领域,但是很少延伸到这之外。
若干年前,JavaScript 被认为限制很多,有一些边缘技术,但是他的主战场还是浏览器。Node.js 已经改变了这一感觉并井喷出了很多 JavaScript 项目,你可以在任何地方使用 JavaScript:浏览器,服务器,终端,桌面甚至嵌入式系统,这使得 JavaScript 无处不在。
第六轮:集成
开发技术很受限制,除非他们能与数据库和驱动集成。PHP 在这方面很强,PHP 面世已经很多年,他的扩展使他能和拥有主流或冷门的 API 的服务器直接通讯。
Node.js 正在迎头直追,但是你也许会为某些老旧,冷门的技术寻找成熟集成组件而头疼。
第七轮:托管和部署
部署你绚丽新应用到在线网页服务器有多容易?这是 PHP 的另一次完胜。随机联系某个网页托管公司你可以找到对主要的 PHP 支持,也许还免费附送 MySQL。对于沙盒,PHP 被认为更简单,有风险的扩展可以被禁用。
Node.js 是个不同的野兽,服务端的应用永远运行。你需要一台物理/虚拟/云或定制的服务器环境,最好有 root 权限,这对有些服务器来说遥不可及,特别是那些共享的服务器,你有可能让整台服务器宕机。
Node.js 托管将会变得简单,但是我认为他永远没法像 FTP 上传一些 PHP 文件那么方便。
第八轮:性能
PHP 很勤快,有很多项目跟选项可以使它跑得更快。即使那些对性能要求很严苛的 PHP 开发者也几乎不会担心速度问题, 但是 Node.js 性能通常更好一些。 当然,性能很大程度上决定于开发团队的经验以及是否上心, 但是 Node.js 还是有如下几条优势的:
更少的依赖
所有对 PHP 应用的请求都必须经过一个 WEB 服务器的路由,来启动 PHP 的解释器运行 PHP 代码。Node.js 不需要这些依赖, 而且你基本一定会使用一个带服务器的框架,像 Express,他很轻量,很好的扮演你应用的一部分。
更小更快的解释器
Node.js 的解释器比 PHP 的更小更灵活。 他并不受旧版语言遗留兼容问题的拖累,而且 Google 在 V8 引擎性能改善上出了大力。
应用永久在线
PHP 遵循标准客户端-服务端模型。 每个页面请求都会初始化应用; 你读取配置参数、连接数据库、读取信息、渲染 HTML。Node.js 应用持久运行,只需要启动一次。例如,你可以创建一个单独数据连接对象,然后所求请求一起复用。公认的,PHP 也有一些途径来实现,比如使用 Memcached ,但是这已经不是语言的标准特性了。

事件驱动,无阻塞 I/O
PHP 跟其他多数服务端语言采用阻塞执行的模型。 当你执行一个命令,比如从数据库取数据,那么必须等这个指令执行完成后,才会执行下面的内容。 Node.js 通常不会等的。 取而代之的是, 你需要提供一个回调函数,这个函数当指令执行完后会被调用一次。例如:
// fetch records from a NoSQL database DB.collection('test').find({}).toArray(process); console.log('finished'); // process database information function process(err, recs) { if (!err) { console.log(recs.length + ' records returned'); } }
这个例子中, 控制台会先输出‘finished’,然后输出‘N records returned’,因为 process 函数是所有数据返回的时候才被调用的。 换句话说,当解释器在其它进程处理的时候可以干些别的事情。
注意情况比较复杂,还有几个警告:
Node.js/JavaScript 只能在单线程上运行,但是大多数 web 服务器都是多线程,而且并发的处理请求。
一个用户长时间运行的 JavaScript 处理会阻止其它用户的代码执行,除非拆分任务或者使用Web Workers。
基准测试是主观的和有缺陷的;可以找到一些例子 Node.js 比较好,而一些相对的例子 PHP 比较好 。程序员只是在尝试证明他们的信仰!
书写异步的事件驱动的代码非常复杂,非常有挑战性。
我只能从我的经验来讲: 我的 Node.js 应用要明显比 PHP 的同等应用要快。你的可能不是,但是不试是永远不会知道的。

评论删除后,数据将无法恢复
段落删除后无法恢复,确定取消删除此段落吗?
评论(77)
引用来自“陨落人间”的评论
感觉现在流行的编程语言就像是皇宫的后妃,php、js、C#、Java、Ruby、Python、Perl、Erlang、C++、Go、Dart、Scala、Haskell....屌丝程序员自我感觉就是太上皇,那些言语,个个都在台下喊,选我选我,要我要我。。。WTF。。不同意。
这完全就不是正确的对比。你如果真的要对比输出hello world
我觉得你应该这么对比
> php:
```
<?php
echo 'hello world';
?>
```
php hello.php
> node:
```
console.log('hello world');
```
node hello.js
因为你只是对比输出hello world。你这段代码node毕竟起了一个http服务器。这对比起来不合理
## 第二轮
同意。
PHP毕竟扎深WEB这么久。社区成熟也是正常的。Node的优势在包的管理以及获取。
## 第三轮
不恰当的对比。
其实语言都有学习成本。但成本高与低而已。
这轮对比,应该是PHP与JS的对比。
## 第四轮
这不用比较感觉。现在的IDE已经强大到你无法理解。
## 环境
Node完胜PHP
一个新手,搭Node只要5秒钟。一个老手,搭PHP要半个小时。如果是各种包编译,以及集成环境安装,呵呵,一天都不为过。新手就不用想了。老实的使用lnmp安装包吧。
## 集成
当前还是同意。
但这不是PHP的优势。因为PHP你说的出来的拓展有几个?估计也是10~20个(redis/memcache/mysql/mysqli/...)。但是Node包,呵呵,你用的估计就有几十个。Node在很多领域都开花了。不同的领域用的包都很多。我觉得以后Node集成优势比PHP更强。
## 性能
PHP7还没用起来。但肯定也很犀利。但肯定还是要结合相关拓展
PHP5.6以下的版本如果比并发,PHP完败。
引用来自“李永波”的评论
不想喷 只想说 让专业的人做专业的事,JAVA 不曾做js的事情,PHP也不曾做 js的事情 。我认为jq走的路比nodejs更符合现在流行规则,程序员当炮灰的太多了,多一个无所谓的语言,让更多的程序员当炮灰吧。引用来自“圣艾夫斯传说”的评论
大叔,我读书少别骗我(高一狗),为什么JavaScript就不适合做后端中的前端或中间件?我所知的是周爱民老师书里介绍到Javascript(Mocha、LiveScript)诞生初期于网景公司里就已有了两种应用环境的实现及应用,称为:Client-Side JavaScript和Server-Side JavaScript。也读了朴灵老师关于Node的书,综合起来我的思考是:Javascript于设计之初就考虑有服务端环境应用场景并有了实践的,或许是她前端的流行掩盖了她与生具来的服务端应用场景的事实,她并不是不少人误解的那样由前端跑到后端里呈娇献媚、显逼格卖情怀的。Node于2009年就诞生了,如今能获得全球更多的关注与运用,说明她发展得不错,是受认可的。有那么些天时地利人和的味道,比如互联网的高速发展带来的高并发高流量问题,V8的崛起和高速发展显著提升性能,而Node基于V8和事件驱动的异步非阻塞I/O的一整套运行环境、机制和架构设计可以成为前面高并发等I/O密集型问题的解决之道,对于CPU密集型问题亦可以通过编写C/C++扩展模块来缓解。熟悉JavaScript开发的人员基数不小,对有志向往后端发展的前端人员来说多了一选择。JavaScript的学习对新手来说也相对简单,开发效率也属较高之列……由我小叔(就职淘宝商家数据部数据挖掘分析及算法设计)那耳闻到这两年BAT不少项目也采用Node或是一些旧项目迁移到Node上,带来的好处有降低了软硬成本、胜任高并发、敏捷灵活,实践中表现是令人满意的。因此,我不认可大叔您说的去用Node的程序员是炮灰,而您说“专业的人做专业的事那一段...”只是您误认为打一开始JavaScript仅仅是个前端脚本语言,然而她却不仅仅是,如今她不过是继承和发扬了她原有的Server-Side一面,得以令更多的人知道并使用罢了引用来自“李永波”的评论
合适才是最好,最佳语言,要有场景才行。JavaScript 是世界上最难理解的语言 — 但是,当哪天你顿悟以后,概念一通,就会发现其他语言都太过笨拙了。
JavaScript 代码比 PHP 简洁。例如,你再不需要跟 JSON 转来转去—— UTF-8 也不用
全栈工程师可以同时在客户端与服务端使用 JavaScript 。大脑不需要来回切换。
深入理解 JavaScript 会让你更想用它,但是 PHP 不是这样。
本人表示非常赞同
引用来自“Raymin”的评论
战场上,C Java Python PHP 是大刀、长枪、铜锤、方天戟!
NodeJS 只是弓箭!
NodeJS 只适合解决一些特定问题,干啥都用,写大量异步逻辑,能把你脑子绞成麻花!
NodeJS 意味着你不能正常走路,要不停地像超级玛丽一样,蹦啊跳啊!
引用来自“Raymin”的评论
战场上,C Java Python PHP 是大刀、长枪、铜锤、方天戟!
NodeJS 只是弓箭!
NodeJS 只适合解决一些特定问题,干啥都用,写大量异步逻辑,能把你脑子绞成麻花!
NodeJS 意味着你不能正常走路,要不停地像超级玛丽一样,蹦啊跳啊!
引用来自“Raymin”的评论
战场上,C Java Python PHP 是大刀、长枪、铜锤、方天戟!
NodeJS 只是弓箭!
NodeJS 只适合解决一些特定问题,干啥都用,写大量异步逻辑,能把你脑子绞成麻花!
NodeJS 意味着你不能正常走路,要不停地像超级玛丽一样,蹦啊跳啊!
引用来自“Raymin”的评论
战场上,C Java Python PHP 是大刀、长枪、铜锤、方天戟!
NodeJS 只是弓箭!
NodeJS 只适合解决一些特定问题,干啥都用,写大量异步逻辑,能把你脑子绞成麻花!
NodeJS 意味着你不能正常走路,要不停地像超级玛丽一样,蹦啊跳啊!