为何2017年的PHP如此唱衰

从今年年初,我就听到QQ群里对PHP招聘市场不乐观的各种讨论,PHPer们人人自危,哀声遍野,PHP是世界上最牛逼的语言也沦落成PHPer们的自嘲段子。

大家觉得PHP是小白语言,没有什么门槛,做的事情无非是增删改查,写写页面,觉得手上的工作一无是处,随时都会被年轻人淘汰,照着今年的招聘市场情况推测,失业貌似就在不久的将来。

我个人觉得这种危机感是有道理的,从招聘市场的变化就能看的出来。背后的原因我也看过几个说法,有一种说法挺有道理,说是2016年以来创业公司频频倒闭,而通常创业公司会选择PHP这种开发效率极高的语言作为首选,因此需求量降低也就可以理解了。

在2016年时,我仍旧在北京,当时参加过几次面试,以PHP作为创业初期语言的多数公司,在业务发展稍稍进入正轨后都在招聘JAVA开发。即便是PHP岗位也希望应聘者进公司后能积极的学一下GO。而它们选择转型JAVA的原因,主要是因为JAVA成熟的框架和轮子,以及大数据方面的生态,另外统一JAVA技术技术体系可以降低公司在研发方面的成本浪费。

在我看来,PHP+GO和纯JAVA技术栈的目标是一样的,讨论哪个语言牛逼是很开玩笑的说法,而因为会什么语言就用什么语言也并不是选择一门语言的唯一理由,看待语言要客观评价。

最近我也打算追赶一下技术潮流,于是纠结着哪门语言值得我去认真的投入一下,GO?JAVA?NodeJS?说实话,没有公司需求驱动的情况下,我去学这些语言的意义并不大,学而不用大概2个月就基本忘光了。把这些时间和精力用在学习其他东西,应该会更有价值点,因此我现在也没有真的动手去认真的学习哪一门新的语言。

即便我无动于衷,也不妨碍我随便说说自己的看法 :mrgreen:

PHP是一门web脚本语言,它的定位就是个view层,它基于多进程的php-cgi完成并发,资源占用多,代码执行阻塞,注定了它无法满足海量并发的业务场景。有人说PHP也可以做秒杀,但是你需要考虑一下牛逼的是redis还是php自身呢。PHP最擅长的工作就是渲染html页面,因为脚本语言本身可以和html混着写,你中有我我中有我。再者,PHP也能访问数据库,自己取数据自己渲染html,开发效率极高,写网站的不二之选。

NodeJS定位和PHP差不多,采用javascript语言。和PHP相比,node采用单线程的事件驱动来实现请求并发处理,将数据库等IO操作全部借助事件驱动异步化,从性能角度看光是这一点就足以取代PHP了。但是node带来的代价也很明显,用PHP编程是阻塞串行方式,对程序员水平要求极低。而node异步化提升性能的前提是编程也必须要异步,这就要求程序员要理解和熟悉事件驱动的原理和编程模式,无疑PHP程序员不太适应这个语言。实际上,虽然node也可以访问数据库,但是node的角色通常比php要纯粹一些,一般不会直接访问数据库,而是调用后端服务获取数据,是一个更薄的view层。

node是单进程的,因此处理能力有限,再者单线程模型很容易因为程序异常停止服务,也容易因为BUG出现内存泄漏等问题。PHP采用php-fpm管理多进程,任何一个子进程退出都可以补充新的子进程,但是缺点就是一个进程同一时刻只能处理一个请求,在并发能力方面远远弱于node。总之,各有各的不幸(不行)。

接下来说大名鼎鼎的JAVA,我们知道JAVA就是一个传统的面向对象语言。现在常用的springmvc是一个WEB框架,程序员的开发方式和PHP没什么本质上的区别,controller,model,view,写一写逻辑,访问一下数据库,渲染一下html。springmvc框架和PHP在并发模型上有本质上的差别,springmvc采用和node一样的事件驱动机制完成网络IO,解析到的每一个请求被传给一个工作线程进行处理,由于工作线程数有限,因此同时并行处理的请求数量有限,后续请求只能排队等待。这样来看,java靠多线程并行和php靠多进程并行好像效率一样,实际上java远不止这点能力。java是可以实现异步处理的,比如业务逻辑需要访问一个后端服务,java可以将本请求挂起并让出工作线程,通过独立于springmvc之外的专门用作RPC的事件驱动线程异步访问后端服务,最后回调springmvc框架将应答返回客户端。如果是PHP,那么无论怎么做都必须阻塞进程一直等到后端返回数据,并发能力是没有办法提升的。

虽然JAVA很牛很灵活轮子很多,但是论开发效率来说是难以和PHP匹敌的,因为JAVA是强类型语言,编码要冗长的多,但也同时带来了更高的安全性,降低犯错误的概率,因此受到政府,金融等行业的青睐。另外一个让我头疼的点在于,JAVA入门容易精通难,在我看来单单是一个JSP模板语言就足以和PHP整个语言的学习成本相当了,更不用说学习springmvc,mybaits等要付出的心血了。

最后说说GO语言,这个语言最有意思的就是协程的并发模型,即便是不怎么了解多线程和事件驱动的程序员,也可以半懂不懂的写出一个多线程并发的小程序。然而绝大多数接触GO开发的PHP程序员,可能首先用的都是beego这些mvc框架。神奇的是,GO因为天生协程的原因,每一个请求都将在独立的协程中被处理,不同的协程之间彼此不会影响,这就导致在GO语言里依旧可以像PHP一样顺序的”阻塞”的编写业务逻辑,然而这里的”阻塞”带着引号,协程帮我们避免了真正的阻塞,例如调用其他服务的RPC请求并不会阻塞什么线程,所有的阻塞IO都被GO悄悄的异步化了,这就是GO为什么深受PHP开发喜爱的一个重要原因,简单啊!

总结

随便预测一下未来(中型企业):

php和node的角色就是个view,它们的目标是渲染页面,而数据需要从后端服务获取。

java和go作为基础服务,为view提供数据,或者直接向客户端提供数据。

如果php开发想在未来的潮流中谋个出路,我当然建议优先考虑GO,不过最重要的是公司和市场需要什么,而不是你喜欢什么。

 

 

 

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~