众所周知PHP是解释性的语言,对于QPS一直是个硬伤,同样的最近火热的GO语言是个编译型的语言,但是两者的接口QPS天壤之别啊,无法比拟。php单台机子qps达到四五百已经很不错了,但是GO可以轻松的上千。这就是解释性语言不能逾越的弊端吗?今天老司机带你们了解一下解释性语言也可以达到这种QPS的成就。
php最多的使用场景就是与nginx通过cgi来交互,这里php-fpm承担了重要的角色,一般php-fpm监听的是9000端口。nginx会把请求达到9000通过php-fpm的协议来处理。
这里虽然看起来没有多长的时间,但是详细的来说说:
nginx接受到请求会首先进入系统态备份数据,然后进程调度到9000端口和php-fpm进行通信,然后让php去处理请求,当然这里的php-fpm是多进程去处理的,nginx来多少请求都会拉起多少个php进程去处理,这里是没啥毛病的。这里最大的毛病就是一个php进程会等待php处理完所有的东西才会返回,然后释放这个php进程,这样一来就会造成了很大的资源浪费,php进程一直在消耗。
那么问题的症结都找到了,我们接下来怎么处理呢?这里老司机有一个大胆的想法,这也是之前同事说的一个想法。
其他的语言都有自己的http包,php没有,php要么和nginxphp-fpm通信要么就是以模块的方式加载到apache中运行。这样一来所有的http请求都会先进入用户态,然后系统备份,再分配进程和php-fpm通信,这里就会浪费大量的请求时间和读写。如果把这里的时间和资源节省下来那就是几何倍的增长。所以要给php有自己的http包就像node一样。这样性能会提升好多倍。
接下来说php多进程,php现在一般是用进程去处理请求,一个进程守护到整个请求结束,如果把底层的处理甩给消息去处理,同过消息去通信这样的话一个进程就会占用的资源更少,负责的使命更短,这样节省下来的资源更多,又是一个质的飞跃。这里性能的提升又是指数级数的翻倍。
所以,老司机认为只要php团队把这些做起来,php的性能会提升很多倍,php就是世界上最好的语言