最重要的一句话: 未来,PHP开发可能是最好的业务系统服务端编程语言。
PHP作为服务端开发的主要语言之一,使用广泛。很多网站或者APP的服务端都是用PHP开发的,其中不乏有像百度、新浪之类的大厂。那么,大厂是怎么用PHP开发业务的呢?结合自己的工作经验和了解到的一些情况,简单说一说。
1、场景
如果你自认为自己是做PHP开发的,那么,请回顾一些自己都用PHP做过一些什么样的事情呢?相信绝大多数PHP工程师尤其是很多初学者,都会回答用来写网站或者服务端。甚至还会有人在基于PHP和前端代码混杂的方式写界面,这是常态。但是,作为一门语言,难道PHP只能写网站或者服务端接口吗?
其实,从我自己的工作经历来看,用PHP来做数据清洗、数据统计甚至流式计算的场景,也并不少。比如,刚开始实习和工作的时候,参与的几个项目里面,大量的用PHP+crontab定时任务来实现数据的ETL或者数据的定时统计功能。如果不知道什么叫crontab,大概你需要去翻翻Linux相关的书籍或者网站了。再比如,业界公开分享过的,链家用strom+PHP 做流式计算,这样的例子在百度也存在很多。再比如用redis做消息队列,然后启动若干PHP常驻进程来消费队列里面的数据做类似实时计算之类的数据清洗;基于PHP实现一些简单的爬虫功能,并基于此来做网站或者接口的可用性监控;基于PHP构建自动化测试用例……等等。
2、框架
PHP语言框架众多,诸如ThinkPHP 、Yii、Laveral、Symfony、CI、Yaf等等,很明显的一个问题是,PHP做网站开发的框架比Java做网站开发多很多。大概是PHP这门语言太容易造轮子了。各大厂选择PHP框架也是多种多样:比如,新浪,之前因为有鸟哥的存在,PHP部分主要用yaf;比如途牛,PHP层面主要用Yii,比如百度,也是因为很久之前有鸟哥的存在,使用一个与yaf基本没太多差别的框架,只是在内部不叫yaf罢了,可以认为yaf是百度内容框架在开源界的产品。当然,还有很多公司选择自己造轮子,基于Cmposer获取很多基础库然后拼一拼就组成了一个框架,比如,孙红雷代言的某二手车电商。
3、语言及周边
看到语言部分,可能很多人会说,不就是PHP嘛,为什么还要说语言。其实,大厂除了PHP之外,还有很多其他的选择。比如,以百度为例,因为之前PHP版本性能问题的原因,一直在寻找能够既能利用PHP开发效率高的优势,又能提高PHP执行性能的方案。所以,在很多人很多年的努力之后,百度终于将高大上的HHVM,搬到百度很多业务的运行环境上面。当然,那个时候,很多公司因为基础技术研发投入的原因,基本还停留在PHP5.*的版本上,直到这两年PHP7正式发布,很多公司,比如新浪微博,才逐渐找到了可以与HHVM性能持平的语言性能解决方案。关于HHVM是啥,基本就是脸书大神赵海平先生以前鼓捣的那套hiphop的东西,后来逐渐演变成了hhvm。多说一句,赵海平先生以前就读于清华,好像是学生物的,后来在脸书工作期间因为搞出了hiphop而名声大噪,后来被挖到阿里做研究员去了,据说还是专注于研究性能方面的东西,此大神实在是我等非科班出身的程序员的学习榜样。
除了语言之外,说一下语言周边。比如,很久之前,百度为了提升在线业务的运行性能,调研了很久之后,最后采用把原来一种旧的服务器换成Nginx的方式,来提升系统性能。再比如,yaf,在一定层面上,也是框架性能方向的一种产物。后来,出于语言性能层面,将hhvm搞到线上业务运行环境,则属于语言性能方向的成功探索和实践。再比如,近期比较火的PHP扩展swoole,也是一种新的语言周边的技术基础设施,这东西的出现给PHP的未来发展增加了很多的可能。比如,基于扩展支持协程、更强的网络通信、自带http服务器等等。但是这东西,据我了解,除了几家公司并且是部分业务使用外,离全量铺展到线上业务,完全成为类似mysql.so这样的基础性扩展还有很远,最起码,在百度是这样。
4、服务化
说道服务端开发,尤其是一些大厂的业务,都比较复杂,就不得不提一个事情,那就是服务化。这个方向最近还有一个非常热的名次,叫微服务,也是一种新的趋势。服务化的基本思路是,原本需要在一个接口或者一个模块里面写一大坨代码的逻辑,通过合理拆分,拆接到不同的模块里面去,并且通过调用模块暴露的特定协议的接口,来将原本冗杂的业务黏合在一起。
在这个方向其实有很多不同的做法。比如,类似途牛之类的电商业务的公司,他们采用的方式是,最底层的服务化,或者叫平台化,采用Java技术体系的东西来实现,然后中间层用类似yii或者yaf之类的框架做一层业务层,或者叫黏合层,对底层的服务接口进行封装,然后给前端暴露http接口供前端使用;也有一些公司,喜欢把最底层的东西用C++实现,剩下的中间层同样基于PHP做一层黏合;当然,还有一种情况,那就是无论底层的服务层还是中间层的业务黏合层,都用PHP来搞,比如百度的很多业务都是这个样子。
服务化少不了中间件,上面说了百度的一些业务无论服务层还是业务层,都用PHP来搞,一个非常重要的原因就是百度的基础中间件比较完善,无论rpc、资源定位和服务发现、还是资源收敛都有很多非常可靠的基础中间件来搞定。当然,关于这些中间件,开源界也有很多其他的方案,比如,鸟哥的yar,基于swoole开发的dora等等。
5、运行环境与运维
曾经有个朋友入职某厂,有一天我们聊到一般刚入职都做些什么的时候,朋友告诉我说,在那家公司,前两天主要在配置开发用到的各种lamp或者lnmp环境。囧。
在这方面,大厂的做法是怎么样的呢?相信很多人搭建博客的时候用过一个一键部署lnmp环境的安装包。很多大厂里也是类似。以百度为例,基础的lnmp开发环境是一个融合好的,组合了nginx\php或hhvm还有各种中间件和扩展以及其他的辅助模块的安装包,新人入职的时候wget一些需要使用到的版本的安装包然后执行两三个启动脚本,环境基本就搭建结束了。其实这个融合包,绝大部分跟外面的一键搭建环境很相似,主要是融入了一些公司基础的中间件。当然,也有一些不同,举个例子,你是怎么解决在一台机器上搭建多套PHP运行环境的?环境与环境之间没有相互组件依赖,不相互影响。有思路吗?建议去lamp.baidu.com上看看,说不定会有一些发现。
还有一个问题,就是PHP的运维的问题。大厂一般都是基于Paas平台来解决这样的问题。业界很多公司,比如头条等等都是基于Docker的解决方案来做资源隔离、服务化以及资源使用率提升。百度也是类似,不同的是,百度最底层并不是基于Docker,而是一种同样基于cgroup的资源隔离基础上的独特资源调度和解决方案。基本可以认为是一台原生服务器上可以启动若干个坑,好吧,英文叫container,然后每个坑里各自跑一套lnmp架构的组件,然后这套组件里面,自带一些日志采集、配置热加载之类的基础设置,算是一些辅助的基础设施吧。 ?业界也有越来越多的公司专注于上述类似的Paas云服务,比如灵雀云、DaoCloud等容器云平台,当然也有一些做云迁移服务的云服务提供商,也能提供一些类似的解决方案,来解决长久以来PHP运维方面的痛点问题。
6、其他辅助设施
对于一个大型复杂的在线业务,尤其是在进行分布式和服务化之后,一般而言都是有很多基础和辅助设施的。比如,前面提到的资源定位、服务发现是一类。当然,辅助设施并不只有这些,一些业界的,无论针对什么语言什么架构方案的基础设施,在大厂里一个也少不了。比如,类似于谷歌Dapper和淘宝鹰眼的分布式链路追踪系统、比如接口调用统计系统、自如,日志采集传输与统计解决方案等等,该有的,一个都少不了。关于这些基础设施或者解决方案,如果有时间的话,其实每个都可以展开写个几千字。
7、PHP的尴尬
PHP还是世界上最好的语言吗?很多人会认为这句调侃没什么问题,并且回答是的。但是,相比于Js呢?想当年我入坑PHP的时候,就是因为参加阿里云的开发者大会,发现阿里和一些参会的公司好多都用PHP,而不是当时已经学会的.net、asp之类的微软的技术。可是,当我大学临近实习的时候,发现,阿里已经很少用PHP了,而是转向了nodejs这套技术栈:相比于数据层用Java+业务层PHP+前端Js的组合,为什么不能直接用数据层Java+业务层node.js+前端Js的组合呢?后者在语言层面少了一层,同时带来的,还有人员成本的较低,技术栈的简化等等。
这就是PHP的尴尬所在:PHP在编程语言的定位层面,做偏前端的东西,不如Js和node;做偏后端的东西,又面临着Java、C++、Go之类的语言的竞争;同时由于PHP的性能问题与功能局限等问题,导致其在表面被人调侃为世界上最好的语言的浮冰之下,潜藏着巨大的市场和使用场景危机。好在,如前面提到的,swoole之类的扩展正在逐渐弥补PHP在网络编程、协程编程等方面的功能短板;同时诸如yaf、swoole、PHP-JIT等技术的逐步发展,也在渐渐的把PHP在性能方面的问题进行逐步改善。
总结
未来,PHP开发可能是最好的业务系统服务端编程语言。 解释请看正文,就酱。