PHP vs Node.js 已翻译 100%

oschina 投递于 2015/07/08 17:58 (共 13 段, 翻译完成于 07-15)
阅读 17126
收藏 96
3
加载中

网络正在处于一个日新月异的发展时代。服务器端开发人员在选择语言的时候非常困惑,有长期占主导地位的语言,例如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。

Tosone
Tosone
翻译于 2015/07/11 23:41
2

我们所钟爱的C#、Java、Ruby、Python、Perl、Erlang、C++、Go、Dart、Scala、Haskell等等,它们呢?

如果文章里边比较了如上所有语言的各种参数,文章将会非常长,你还会读它么?你期望一个程序员了解所有的程序开发语言吗?这显然是不可能的。我主要对PHPNode.js做了比较,主要原因如下:

  1. 首先它们之间值得比较。两者都是开放源码,都是致力于web开发,并且都可用于相似的项目。

  2. PHP已经发布了很久了,但是Node.js才刚刚兴起,并受到越来越多的关注。难道PHP的程序员应该相信Node.js的宣传?应该考虑转换语言?

  3. 我了解,热爱编程语言,自从20世纪90年代之后我就一直使用PHP和JavaScript,并且也有几年的Node.js的经验。除此之外我也涉猎了其他的技术,但是在这里我还不能对他们作出客观评价。

另外,对多少语言做比较不重要,因为总会有某些地方的某些人抱怨我没有提到他们语言。 

SitePoint上的角逐

程序员会花费很多时间来提升他们自己的编程能力。一些人有编程语言之间的延伸能力,但是这些达到更高层次的人根据很多的因素来做出他们自己的选择。从主观方面来说,你将会推进并且捍卫你的技术决策。

SitePoint Smackdowns并没有采取“选择适合你自己的,朋友”这样的观点。我将会根据个人的经验、要求和喜好提出建议。你可能不会同意所有的我所说的所有观点,这并不重要,重要的是你的意见将会给其他人做出更加明智的选择。

Tosone
Tosone
翻译于 2015/07/12 20:48
1

评估方法

下面将会对 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 经验的人也很难理解。


gones945
gones945
翻译于 2015/07/14 22:19
1

PHP 在概念上更简单所以赢得本轮。稍微懂得一些 PHP 声明的人就可以开发一些有用的东西。PHP 有更多的软件依赖,但是 PHP 的概念对于新手来说不那么繁琐。

懂一些 JavaScript 和开发 Node.js 应用是两回事儿,Node.js 开发方法和大多数服务端技术不同,你需要先弄明白一些相当复杂的概念,比如关闭和回调函数。

第二轮:帮助和支持

没有官方文档和资源(课程,论坛,堆栈溢出)的帮助你必将举步维艰。 PHP 在本轮轻易胜出,她有大量的指南和二十年的 Q&A。无论你想做什么,总会有人在你之前已经面对过同样的问题。

Node.js 拥有很好的文档,但是更加年轻,能提供的帮助较 PHP 也少。JavaScript 在市面上的时间和 PHP 一样久,但是主要的帮助都是针对浏览器开发的,那基本没啥帮助。

a
akzhao
翻译于 2015/07/13 15:47
1

第三回合: 语言语法

声明与结构是不是符合逻辑而且简单好用?

不像一些语言跟框架,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 胜。理由如下:

  1. JavaScript 是世界上最难理解的语言 — 但是,当哪天你顿悟以后,概念一通,就会发现其他语言都太过笨拙了。

  2. JavaScript 代码比 PHP 简洁。例如,你再不需要跟 JSON 转来转去—— UTF-8 也不用

  3. 全栈工程师可以同时在客户端与服务端使用 JavaScript 。大脑不需要来回切换。

  4. 深入理解 JavaScript 会让你更想用它,但是 PHP 不是这样。

Frank_mc
Frank_mc
翻译于 2015/07/15 10:02
2

第四轮:开发工具

两种技术都有一些很好的编辑器,集成开发环境,调试器,验证器和其他工具。我认为这是平局,但是这里有一些工具给 Node.js 些许优势:NPM-包管理器。 NPM 允许你安装和管理依赖,设置配置变量,定义脚本和其他。

PHP 的 Composer 项目受 NPM 激发,在有些方面更强。但是,PHP 在默认情况想不提供,活动库较小,在社区的影响更小。

Grunt 和 Gulp 之类革新了开发方法的构建工具的壮大,NPM 也有一部分功劳。有时候 PHP 开发者也许想要/需要安装 node.js,这不是倒退。

a
akzhao
翻译于 2015/07/13 16:02
1

第五轮:环境

技术可以在哪使用和部署?支持哪些平台和生态系统?网页开发者经常需要开发一些并不完全针对网页的应用,比如构建工具,迁移工具,数据库转换脚本等。

PHP 有办法开发桌面应用和命令行工具,但是你不会使用他们。本质上,PHP 是一个服务端技术,他很擅长该领域,但是很少延伸到这之外。

若干年前,JavaScript 被认为限制很多,有一些边缘技术,但是他的主战场还是浏览器。Node.js 已经改变了这一感觉并井喷出了很多 JavaScript 项目,你可以在任何地方使用 JavaScript:浏览器,服务器,终端,桌面甚至嵌入式系统,这使得 JavaScript 无处不在。

a
akzhao
翻译于 2015/07/13 16:13
1

第六轮:集成

开发技术很受限制,除非他们能与数据库和驱动集成。PHP 在这方面很强,PHP 面世已经很多年,他的扩展使他能和拥有主流或冷门的 API 的服务器直接通讯。

Node.js 正在迎头直追,但是你也许会为某些老旧,冷门的技术寻找成熟集成组件而头疼。

第七轮:托管和部署

部署你绚丽新应用到在线网页服务器有多容易?这是 PHP 的另一次完胜。随机联系某个网页托管公司你可以找到对主要的 PHP 支持,也许还免费附送 MySQL。对于沙盒,PHP 被认为更简单,有风险的扩展可以被禁用。

Node.js 是个不同的野兽,服务端的应用永远运行。你需要一台物理/虚拟/云或定制的服务器环境,最好有 root 权限,这对有些服务器来说遥不可及,特别是那些共享的服务器,你有可能让整台服务器宕机。

Node.js 托管将会变得简单,但是我认为他永远没法像 FTP 上传一些 PHP 文件那么方便。

a
akzhao
翻译于 2015/07/13 16:29
1

第八轮:性能

PHP 很勤快,有很多项目跟选项可以使它跑得更快。即使那些对性能要求很严苛的 PHP 开发者也几乎不会担心速度问题, 但是 Node.js 性能通常更好一些。 当然,性能很大程度上决定于开发团队的经验以及是否上心, 但是 Node.js 还是有如下几条优势的:

更少的依赖

所有对 PHP 应用的请求都必须经过一个 WEB 服务器的路由,来启动 PHP 的解释器运行 PHP 代码。Node.js 不需要这些依赖, 而且你基本一定会使用一个带服务器的框架,像 Express,他很轻量,很好的扮演你应用的一部分。

更小更快的解释器

Node.js 的解释器比 PHP 的更小更灵活。 他并不受旧版语言遗留兼容问题的拖累,而且 Google 在 V8 引擎性能改善上出了大力。

应用永久在线

PHP 遵循标准客户端-服务端模型。 每个页面请求都会初始化应用; 你读取配置参数、连接数据库、读取信息、渲染 HTML。Node.js 应用持久运行,只需要启动一次。例如,你可以创建一个单独数据连接对象,然后所求请求一起复用。公认的,PHP 也有一些途径来实现,比如使用 Memcached ,但是这已经不是语言的标准特性了。

Frank_mc
Frank_mc
翻译于 2015/07/14 20:22
1

事件驱动,无阻塞 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 的同等应用要快。你的可能不是,但是不试是永远不会知道的。


Frank_mc
Frank_mc
翻译于 2015/07/14 19:43
1
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(77)

mousisi@
mousisi@

引用来自“陨落人间”的评论

感觉现在流行的编程语言就像是皇宫的后妃,php、js、C#、Java、Ruby、Python、Perl、Erlang、C++、Go、Dart、Scala、Haskell....屌丝程序员自我感觉就是太上皇,那些言语,个个都在台下喊,选我选我,要我要我。。。WTF。。
666
yambo
yambo
不存在十全十美的语言,选出10个世界上公认最完美的女人,也肯定是各有千秋。不过语言好不好只是一部分,还看怎么用,用的如何。
杨志兵
杨志兵
## 第一轮

不同意。

这完全就不是正确的对比。你如果真的要对比输出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一面,得以令更多的人知道并使用罢了 再说这不妨碍别人多学一些东西,刻苦努力达到该专业水平啊,就像我有志日后成为程序员,但也不妨碍我学习古筝啊,当然目前只是个古筝5级狗

引用来自“李永波”的评论

合适才是最好,最佳语言,要有场景才行。
k
kaven276
不是原创,下面只是引用:

JavaScript 是世界上最难理解的语言 — 但是,当哪天你顿悟以后,概念一通,就会发现其他语言都太过笨拙了。
JavaScript 代码比 PHP 简洁。例如,你再不需要跟 JSON 转来转去—— UTF-8 也不用
全栈工程师可以同时在客户端与服务端使用 JavaScript 。大脑不需要来回切换。
深入理解 JavaScript 会让你更想用它,但是 PHP 不是这样。

本人表示非常赞同
Isronik
Isronik

引用来自“Raymin”的评论

战场上,
C Java Python PHP 是大刀、长枪、铜锤、方天戟!
NodeJS 只是弓箭!

NodeJS 只适合解决一些特定问题,干啥都用,写大量异步逻辑,能把你脑子绞成麻花!

NodeJS 意味着你不能正常走路,要不停地像超级玛丽一样,蹦啊跳啊!
现在写hybrid就有这样的感觉。。。
城仔
城仔

引用来自“Raymin”的评论

战场上,
C Java Python PHP 是大刀、长枪、铜锤、方天戟!
NodeJS 只是弓箭!

NodeJS 只适合解决一些特定问题,干啥都用,写大量异步逻辑,能把你脑子绞成麻花!

NodeJS 意味着你不能正常走路,要不停地像超级玛丽一样,蹦啊跳啊!
php只能写网站 就是渣渣
城仔
城仔
php只能写网站 就是渣渣
城仔
城仔

引用来自“Raymin”的评论

战场上,
C Java Python PHP 是大刀、长枪、铜锤、方天戟!
NodeJS 只是弓箭!

NodeJS 只适合解决一些特定问题,干啥都用,写大量异步逻辑,能把你脑子绞成麻花!

NodeJS 意味着你不能正常走路,要不停地像超级玛丽一样,蹦啊跳啊!
php只能写网站 就是渣渣
城仔
城仔

引用来自“Raymin”的评论

战场上,
C Java Python PHP 是大刀、长枪、铜锤、方天戟!
NodeJS 只是弓箭!

NodeJS 只适合解决一些特定问题,干啥都用,写大量异步逻辑,能把你脑子绞成麻花!

NodeJS 意味着你不能正常走路,要不停地像超级玛丽一样,蹦啊跳啊!
php只能写网站 就是渣渣
返回顶部
顶部