인터넷은 급속한 발전의 시대에 있습니다. 서버사이드 개발자들은 언어를 선택할 때 매우 혼란스러워합니다. C, Java, Perl 등 오랫동안 지배적인 언어도 있고 Ruby, Clojure 등 웹 개발에 중점을 둔 언어도 있습니다. 그리고 가십시오. 프로젝트가 잘 진행되고 있는 한, 귀하의 선택은 그다지 중요해 보이지 않을 것입니다.
그런데 어떻게 이 새로운 웹 개발자가 올바른 선택을 하도록 할 수 있을까요?
PHP와 NodeJ라는 두 진영 사이에 전쟁을 일으키고 싶지 않습니다. 현장에서 이 두 언어의 개발 상태를 비교해 보겠습니다.
우리가 사랑하는 C#, Java, Ruby, Python, Perl, Erlang, C++, Go, Dart, Scala, Haskell 등은 어떻습니까?
위에 언급된 모든 언어의 다양한 매개변수를 기사에서 비교한다면 기사가 매우 길어질 것입니다. 프로그래머가 모든 프로그래밍 언어를 알 것으로 기대하시나요? 이것은 분명히 불가능합니다. 주로 PHP와 Node.js를 비교한 이유는 다음과 같습니다.
그리고 얼마나 많은 언어를 비교하는지는 중요하지 않습니다. 왜냐하면 내가 그들의 언어를 언급하지 않았다고 불평하는 사람이 항상 어딘가에 있기 때문입니다.
SitePoint 경쟁
프로그래머는 자신의 프로그래밍 기술을 향상시키는 데 많은 시간을 보냅니다. 어떤 사람들은 프로그래밍 언어 사이를 확장할 수 있는 능력을 가지고 있지만 더 높은 수준에 도달한 사람들은 여러 요인을 기반으로 스스로 선택합니다. 주관적으로 귀하는 기술적 결정을 발전시키고 방어하게 됩니다.
SitePoint Smackdowns는 "친구여, 당신에게 적합한 것을 선택하라"는 관점을 취하지 않습니다. 개인적인 경험, 요구 사항 및 선호도를 바탕으로 추천해 드리겠습니다. 당신은 내가 말하는 모든 것에 동의하지 않을 수도 있지만 그것은 중요하지 않습니다. 중요한 것은 당신의 의견이 다른 사람들이 더 많은 정보를 바탕으로 선택하는 데 도움이 된다는 것입니다.
평가 방법
다음은 PHP와 Node.js를 10회 비교합니다. 각 라운드에서는 모든 웹 기술에 적용할 수 있는 일반적인 개발 과제를 고려합니다. 우리는 너무 자세히 설명하지 않을 것입니다. 난수 생성기나 배열 정렬의 가치에 관심을 갖는 사람은 거의 없습니다.
가장 많은 라운드를 승리한 사람이 승자가 됩니다. 준비됐나요? 전투를 시작하자. . . . . .
1라운드: 시작하기
'Hello World' 웹페이지를 만드는 속도는 얼마나 되나요? PHP:
<?php echo 'Hello World!'; ?>
이 코드는 PHP 엔진에서 구문 분석할 수 있는 모든 파일(일반적으로 .php 접미사가 있는 파일)에 배치할 수 있습니다. 파일로 이동하려면 브라우저에 URL을 입력하기만 하면 됩니다.
물론 그게 다가 아닙니다. 이 코드는 PHP가 설치된 웹 서버에서만 실행됩니다(PHP에는 내장 서버가 있지만 더 강력한 서버를 사용하는 것이 더 좋습니다). 대부분의 운영 체제는 Windows의 IIS, Mac 및 Linux의 Apache와 같은 서버 소프트웨어를 제공하지만 시작 및 구성이 필요합니다. 일반적으로 XAMPP와 같은 사전 구축된 설치 프로그램이나 Vagrant와 같은 가상 머신 이미지를 사용합니다. 더 쉬운 방법: 파일을 웹 호스트에 업로드하세요.
반면에 Node.js를 설치하는 것은 매우 쉽습니다. 설치 프로그램을 다운로드하거나 패키지 관리자를 사용할 수 있습니다. 다음으로 hello.js에서 웹페이지를 만들어 보겠습니다.
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 胜。理由如下:
第四轮:开发工具
两种技术都有一些很好的编辑器,集成开发环境,调试器,验证器和其他工具。我认为这是平局,但是这里有一些工具给 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 应用要明显比 PHP 的同等应用要快。你的可能不是,但是不试是永远不会知道的。
第九轮:开发者激情
这会超出”常见网页开发挑战“这样的目标,但是这很重要。如果你恐惧每天写代码,那你无所谓哪门语言更好。
很难为此做出比较但是一些 PHP 开发者对 PHP 这门语言很有激情。你最近一次读到让你走心的 PHP 文章或幻灯片是什么时候?也许已无需再说?可能是更低的曝光度?或者我没找对地方?PHP7 有一些新的功能,但是该技术已经原地踏步很多年了,虽说如此,很少有开发人员对PHP发牢骚。
JavaScript 分离了社区,有人爱也有人恨,一些程序员在中间犹豫不决,经管如此,对 Node.js 的反馈大多积极,她正处于风口浪尖,一部分原因是因为她很新,赞誉不一定持续。目前,Node.js 赢得本轮。
第十轮:前景
您选择采用哪种服务端语言并不重要;即使她不再被更新也会照样继续工作(yay ColdFusion!)尽管使用量上趋于稳定但是很多人依然使用 PHP,我打包票她还能再坚挺二十年。
Node.js 崛起得很迅速,她提供了一种现代的开发方式,使用和客户端开发一样的语法同时支持 HTML5 变革式的特征,比如网络套接字和服务端发送事件。尽管大家对该语言的分叉函数有些争议,但是Node.js的使用量还是呈指数级增长。
Node.js는 PHP의 시장 점유율을 잠식할 수밖에 없지만 완전히 대체할 수는 없을 것 같습니다. 두 기술 모두 밝은 미래를 가지고 있습니다. 이번 라운드를 무승부로 선언합니다.
최종 승자
최종 점수: Node.js가 5라운드 승리, PHP가 4라운드 승리, 1라운드 동점. 한쪽으로 기울어질 줄 알았는데 생각보다 적당한 정도였습니다.
Node.js는 학습 곡선이 있어 초보자에게 적합하지 않지만 이번 대결에서는 Node.js가 승리합니다. 그리고 당신이 언어를 좋아하는 탄탄한 JavaScript 프로그래머라면 Node.js는 당신을 실망시키지 않을 것입니다. 더욱 최신 상태이고 자신만의 웹 개발 경험을 제공하므로 PHP를 놓치지 않을 것입니다.
내 조언은: 옵션을 평가하고 필요에 따라 언어를 선택하는 것입니다. 이 기사는 이와 같은 "비교" 기사보다 훨씬 더 신뢰할 수 있습니다.
위 내용은 PHP와 Nodejs의 모든 측면을 포함하여 심도 있는 논의를 소개했으며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.