大概PHP开发人员都比较讨厌这个说法,诸如此类的还有

PHP凉了吗?
PHP穷途末路了?
Is PHP Dead?
学PHP不如学nodejs、go .....

知乎和很多技术社区都充斥这种话题,PHP的维护者大概会说

PHP没问题,是phper的问题
你凉了,PHP也不会凉
世界上大多数网站都是PHP开发的
PHP入门快,开发快,中小型网站首选
性能不足?你大概没听过swoole吧

除了恶意抹黑的,恶意夸赞的,带有利益关联的,还有更多的是其他的语言社区的调侃:

PHP是世界上最好的语言

任何编程语言都有多面性,都有自己的独特优势,就像PHP二十多年,即便和现代语言相比有许多不足,但依然能诞生了许多优秀的软件,情人眼里出西施,许多phper珍惜她陪伴的日日夜夜,依旧深爱着这个“最好的语言”。

只是像上面一样,针对PHP的弊端和未来持怀疑和悲观看法的人愈来愈多,社区内人心思变亦愈发明显,PHP现在无疑处在一个关键节点上,即便现在PHP的存量项目十分庞大,但趋势一旦形成,如果没有强有力的扭转力量,到某个时间点就会一泻千里,急速消亡,就像当初的Flash/ActionScript一样,曾经多风光,现今谁记得!

好了,不做更多的情绪化吐槽,以下仅从我个人的经历,分析归纳PHP困境的表现和产生的原因。

一、对PHP的认识

作为一门脚本语言,PHP首要的是写得快,写的爽,不要有过多的心智负担,如果需要性能或者特殊功能无法实现,就用它的底层语言(C语言)实现,多数脚本都是这样做的,像 C+Python、nodejs C/CPP+JavaScript、Nginx+Lua等等,熟悉游戏开发的开发者应该很熟悉这个套路,不管是客户端还是服务端,通常底层搞个C/C++,常规业务配个Lua,兼顾性能和开发效率。PHP的很多函数效率极高,其实只是包装的C函数而已。

上述模式在大多数场景效果很好,有性能、有效率,只要底层服务足够多,即便不会使用底层语言C/C++,只用脚本本身也能满足大多数项目需求。

​二、PHP差了什么

PHP在标准库和扩展规范上一直没有做到标准化、规范化,分散的函数库和类库,早起面向过程和后期面向对象的混杂,当然这有很多的历史遗留问题,亦或者是保持兼容性,这方面不是我要表达的重点。重点是PHP在底层服务方面有致命的缺陷,尤其随着近年来开发模式的不断发展,互联网用户规模的扩大,node/go等方案的强势崛起,这种缺陷愈发致命。

​PHP官方不提供基础服务的实现

这里说的网络服务不是socket/stream的系统函数包装,而是基础的server,就像你用nodejs不用自己去实现个http服务器,go就更不用说了,多年来,PHP官方方案依旧是依赖于Apache/Nginx/PHP-FPM,PHP自己根本没有独立性,几乎将PHP限制死在了简单的web应用上。

其实也不用追求什么异步、协程,像Java大多数应用的还是跑在阻塞的api上,那又如何?不是照样风生水起。PHP虽然没有多线程,可linux多进程也没差到哪儿去,再加上常驻内存,其实可以有极大的性能提升和更广阔的应用场景。

一直以来我都很难理解PHP官方为什么不做基础server,尤其是现在node/go/dart等,新生代的解决方案都会自带一个标准实现,直到最近才稍有感悟:

​PHP官方对PHP的定位是什么?

PHP is a popular general-purpose scripting language that is especially suited to web development.

​似乎一直是这样,从没改变过,只不过十年前的web开发和现在的web开发早已天差地别,但是官方好像不是这样想的,近年来,除了PHP5.4和PHP7有两次大的内部性能的提升外,并没有什么有效的变革,我不能说这些没什么用,我只想说这个世界竞争激烈,开发者和语言没有领结婚证,外面的小贱人多得是。

顺便引申一下PHP扩展开发,PHP官方好像没有优化扩展开发体验的计划,那个Zend Api真是一言难尽,数次想用扩展开发的功能最后用了RPC

PHP对一些基础功能极度依赖C语言的实现,如果底层没有实现,几乎是必须要引入第三个编程语言解决。

社区对PHP的期待是什么?

从简单的博客站点到如今的分布式应用、微服务,社区对PHP在标准化、规范化、性能、适用场景一直有更高的期待,期望她能在原来的web上更进一步。为此通过扩展、开发模式等各方面尝试新的模式,reactphp/amp/php-pm/swoole/roadrunner/workerman等方案提供了基础的网络服务,pthreads/parallel/pth 提供了多线程的方案,swoole提供了协程的方案,PSR社区标准和Composer包管理器为现代规范打下基础,更有 jphp/peachpie/polarphp 等新的解释器的尝试,可以说phper一直在努力让PHP更现代,走向更广阔的空间,可惜的是多数方案的质量根本难以和node/go等语言内置的方案竞争,由于不是官方支持,或者支持平台有限,测试不足,API不友好等原因,在PHP社区内部也难以普遍接受。

看了PHP的rfc,还是在集中于语法、jit,官方似乎从来都不关注一些常用基础设施。或许zend公司不求上进,php开发团队定死了php的运行模式,亦或是我要求太多了吧。是啊,你对php做过什么贡献,你凭什么要这要那~~

三、简单说下swoole

最初使用swoole还在1.x,还没有websocket实现,还是多进程/异步的模式,做过好多个项目,游戏、IM、网关等等,有一些坑,还好要么简单调整下源码或者规避掉也没什么大问题,也买过swoole的加密软件,swoole前期一直在尝试各种模式,后来固定到协程,也算是稳定了方向,整体还是很赞赏swoole团队的。只不过我们后来逐步过渡了其他模式,引入了其他语言,就用的少了。

商业化也无可厚非,谁都不是喝西北风的。不过我建议swoole做一次大的减法,固定一种开发模式,只做核心的功能,可以减轻开发压力,提高软件稳定性,也可以适当减轻商业化的压力。有时候这样也行,那样也行,还不如专注一样。

还有即便商业化,也及不赞成swoole去扶植任何一个框架,那是社区的事情,官方应该去做一些商业配套软件,php和swoole已经十分上层了,稍有技术积累的团队不会轻易采用那些框架。也建议社区不要做过多的框架,社区缺的是高质量的组件,例如搞一个完整的、独立的、无依赖的、适合协程环境的数据库组件,比那些有价值的多

我更建议开发者关注roadrunner这样的的方案,尤其有go经验的开发者,这种方案可能更合适,过渡更平滑,兼容性、扩展性更好。如果你接受两种语言的交互方式,也可以用Rust、C++。

四、吐槽一下技术舆论环境

唯大公司马首是瞻,所有的技术都向bat看齐,大公司的技术没什么神秘的,而且很多大公司的技术方案跟业内所认为的相差甚远。越是我们认为人家会用的,其实根本没有,或用的很少,java体系最为突出

从BAT“出来”的同学,不要胡乱传播技术方案,人家100个项目,有3个用到了框架A,还是魔改的,你就胡扯这个公司大面积使用框架A,赶紧上车吧,然后你有又搞不定~~

培训企业,卖视频、卖课程的经常编造一些技术方案、面试场景,而且还恶意攻击相似技术,太没底线

培训的质量是一年不如一年了

五、结语

当前的技术方案百花齐放,竞争非常激烈,如果PHP不能提出有竞争力的方案,那它的历史使命就快结束了,开发者都是喜新厌旧的,相爱的时候你侬我侬、缠绵悱恻,离开的时候头也不回,始乱终弃。

祝 PHPer 2020年好运