PHP 是否正在死去?

待兔
• 阅读 628

作为一个早期把 PHP 当作主要语言的开发者,我已经忘了上次写一个纯 PHP 项目是什么时候了。我知道 PHP 正在变得越来越完善,在我写这篇文章的时候 PHP 8.3 已经进入开发阶段,但我身边几乎没有人去谈论它,连我也是在偶尔翻翻官网的时候才知道最新的版本消息。

无声的旁观者

PHP 是最好的语言。

这当然是一句调侃的话,已经快成为码农们的切口了,但也一定程度上反应了它的地位。在那个年代,PHP 草根般的存在告诉你,不需要什么架构,也不需要学啥框架就能弄一个像模像样的网站出来,这是属于个人站长的狂欢。PHP 就像地下世界的无冕之王,好像上不得台面,但作为一个开发者你却无法绕过它的存在。


但让人尴尬的是,就算是调侃,现在也已经很少有人再去提起 PHP 了。而对新一代的开发者来说,PHP 已经逐渐变为一种边缘化的古典技术,其地位大概跟我们当初看 Perl 差不多。


很难想象这是一个在 Web 时代叱咤风云的编程语言,毕竟它曾经是互联网技术中基石般的存在。当然现在我们也不能说 PHP 完全消失了,毕竟靠 WordPress 建立的站点依然占据了互联网的很大流量。但首先 Web 已经不是互联网的全部流量来源,甚至我们可以说它已经不是主要流量了,诸如移动互联网,短视频,聊天等等已经占据了互联网用户的绝大部分使用时间。而 PHP 跟这些新的业务形态不能说完全无关,但存在感实在也可以忽略不计。


我们回忆一下互联网领域最近几年出现的技术浪潮:移动互联网,微服务,云原生,客户端渲染,区块链,AI 等等。这些关键词打出来后都很难和 PHP 联系起来,我们不得不说它成了旁观者。长时间的沉寂,也让很多最初的拥趸都投奔了其它语言。毕竟人都是要吃饭的,如果主流市场上 PHP 的投入产出比太低,所有人都会用脚投票。

PHP 的局限性

应该说,作为一门语言,其它语言能干的事情 PHP 肯定也都能干,但如果我们仅仅从这个方面入手,世界上根本就不该存在这么多编程语言了,每门语言肯定都有它的优势与局限性。PHP 的优势我已经提到过,就是极低的门槛,它的门槛低到你把一个 html 文件后缀改成 php,就可以成为你的第一个 PHP 程序了,虽然这里面没有一行 PHP 代码


从这里你也可以看出来 PHP 对 Web 是多么的友好,而这也带来了它的局限性。PHP 是一门从 CGI 时代发展过来的语言,什么是 CGI?你可以看作,每一次请求都重新启动了一个进程去响应,这在互联网的初期是够用的,毕竟那时候上网的也没几个,但随着访问量的爆发式增长,每个进程去扛一个请求显然是靠不住的 (PHP 最早也是 CGI 的)。


因此 PHP 发展出了 FPM (FastCGI Process Manager),从这个名字你也可以看出它跟 CGI 千丝万缕的联系,其本质也是如此,只不过单个 CGI 进程变成了受 FPM 控制的 FastCGI 进程池,单个进程处理完当前请求后不再退出,而是等待分配下一个请求再继续处理。所以 PHP-FPM 减小了每次响应都需要重新启动进程的开销,而 FPM 仍然是目前 PHP 最主流的部署形式。


这给 PHP 带来了一个独一无二的特性,相当于每次请求程序都从头开始执行一次。所以你根本不需要去担心什么内存泄漏 (前提是你别一次就把内存撑爆),什么响应时间过长 (反正进程池会自己 kill),不论你的代码写得多么烂,只要它语法对了,就可以跑起来。这就成了 PHP 的“万恶之源”,毕竟在其它语言看来,您这底线也太低了,简直就是来者不拒😂。


当然门槛低并不构成局限性,这只是它的特色,写出来的代码烂也只是使用者的问题,通过各种标准和框架的约束,PHP 也能写出很优美的代码,特别是 PHP 7 以后随着各种新特性的加入,已经让其变成一个和 Java 类似的完全 OOP 的语言。


在我看来 PHP 最主要的局限性就是它跟 Web 的强绑定属性,因为 FPM 的存在让 PHP 程序无法做到常驻内存,这虽然让它的编写门槛变低了,但也牺牲了很多重要的特性。在 Web 时代,所有的渲染都在服务端完成,这问题不大。但到了移动互联网时代,甚至后面的客户端渲染时代,服务端的主要角色从响应大的页面请求,变成了一个个 API 的提供者,请求的数量以及连接数再次呈级数上升。再用进程去响应请求成本太高了,而且不能常驻内存也让 PHP 程序几乎无法享受内存带来的缓存优势,这就让很多新时代的应用在选择系统架构时,天然地把 PHP 放在了选项之外。


而这是技术上的问题,其实技术上的问题都是可以解决的。当然我也知道诸如 Swoole 这样的技术,从某种程度上已经提出了一个解决方案。但是比技术问题更本质的是 PHP 官方的态度,它们似乎并不打算改变目前的现状,即 PHP 作为一个 Web 领域的解决方案继续存活下去。因此大家还是继续用 FPM 来部署程序,线程协程这类技术在 PHP 中只能成为边缘般的存在。毕竟 CGI 的运行方式已经深入了 PHP 的骨髓,如果 PHP 真的变成像 Node 那样常驻内存的,我估计 90% 的 PHP 程序员会骂娘。这应该也是开发团队迟迟不转向的原因所在吧,如果真的变了,那还是 PHP 吗?我为啥不直接用其它语言呢?

老兵不死,只是逐渐凋零

我写这篇文章的初衷本来只是调侃一下 PHP 的现状,它的未来如何也不是我能置喙的。但没想到写来写去也脱离不了爱之深恨之切的套路,也许这就是因为我还记得它当初最美好的模样吧。每个人都无法接受心中最美好事物的凋零,而至少我可以渐渐接受它的离去。


PHP 从来没有死去,而且只要 Web 存在,它还会活得好好的。只是它没法站上主流的舞台,或者也许我也错怪了它,PHP 从来没有想过成为主流,它只是想把自己分内那点活干好,然后拂袖而去,深藏功与名。

点赞
收藏
评论区
推荐文章
Souleigh ✨ Souleigh ✨
4年前
PHP 8 有哪些值得期待的新特性
新的PHP主要版本PHP8预计将于2020年底发布。它现在正处于非常活跃的开发中,所以在接下来的几个月里,开发速度和开发进程可能会有很大的变化。在这篇文章中,我会罗列出PHP8中会发生的一些改变:新功能、性能改进和突破性变化。因为PHP8是一个新的主要版本,所以代码及语法向下兼容性会更低。如果您一直保持与最新版本保持同步,
Alex65 Alex65
3年前
为什么要从php 加入到 go 的潮流
为何我要说加入go开发是一种潮流,尤其是对于php开发人员,我加入了很多go的开发群或者爱好群,发现大部分人都是从php过来的,原本google开发golang是想让更多的c/c人员来使用。PHP语言作为当今最热门的网站程序开发语言,它也是我多年来一直使用的语言,它具有成本低、速度快、可移植性好、内置丰富的函数库等优点,因此被越来越多的企业应用于网站
Aimerl0 Aimerl0
3年前
每日一题(二)
2021.01.25不知道为什么,腾讯管家扫毒的时候把我这篇文章扫出来了,然后我顺手给清掉了,只能选择重新发一遍了写在前面每日一题每十题开一篇新文章RoarCTF2019EasyCalc刚进来是有一个计算器的功能,试了好大好大的数,没有发生溢出情况,查看源代码发现了东西访问calc.php发现过滤的php代码<?phperrorre
Wesley13 Wesley13
3年前
ubuntu卸载php7并安装php5.6记录
      ubuntu16.04版本从默认源安装的php版本为7.x版本,我们都知道php7.0已经舍弃了很多旧版本的函数等内容,这对旧系统来说是致命的,那么,我们就有了安装旧版php的需求,而同一主机安装两个版本的php,如果不做配置会报错。那么,我们就需要:一、卸载php7.x;1)如果我们知道在安装php7的时候都安装了那些包及扩
Wesley13 Wesley13
3年前
PHP数据结构之实现链式二叉树与遍历
<?php/ 我写的PHP都是从C语言的数据结构中演化而来
Wesley13 Wesley13
3年前
PHP POST 接受长字符串时出现500错误
昨天在开发的时候遇到一个问题,formentype“multipart/formdata”表单提交时显示500错误。开始我以为是php代码问题,我检查了一遍代码,没有问题。之后设置断点,依旧报错500,这就说明断点代码就没有执行,表单提交动作根本没有触发后端的php代码。于是,我将注意力放在了php配置上,反复修改配置调试,而且重装了php依
Stella981 Stella981
3年前
PHP的前世今生
大家都知道,Facebook、淘宝等早期都是用PHP写的,在中国,PHP在百度、新浪、腾讯这三大互联网公司中应用比较多。自1995年由丹麦人RasmusLerdorf(雷斯莫斯·勒道夫) 创建 PHP 以来,PHP语言经历了激烈的演进。PHP/FI1995年_摘要:用Perl写的小工具_PHP继承自一个老的工程,名叫P
Wesley13 Wesley13
3年前
5个php实例,细致说明传值与传引用的区别
今天有个同事问我传值和传引用有什么不同,这让我想起了,刚学php的时候,那个时候做过很多项目,做东西多,就以为自己php掌握的差不多了,随着时间的推移,越深入的学习,越觉得自己知道的真的很少,很少。哈哈,会用只是初级阶段,要了解原理是什么,这样才能更好去运用,费话不多说1.传值:是把实参的值赋值给行参,那么对行参的修改,不会影响实参的值
Wesley13 Wesley13
3年前
PHP中的NOW()函数
是否有一个PHP函数以与MySQL函数NOW()相同的格式返回日期和时间?我知道如何使用date()做到这一点,但是我问是否有一个仅用于此的函数。例如,返回:2009120100:00:001楼使用此功能:functiongetDatetimeNow(){
敏捷开发 敏捷开发
8个月前
我们都应该学习PHP
估计有很多朋友是因为PHP这三个字母进来阅读的。现在开发者社区里面都在贬低PHP,唱衰PHP,已然成了一个梗。但我觉得PHP非常值得大家重新认识,PHP开发者社区也非常值得大家学习。不见得是来学习PHP这门编程语言,可以学习PHP这门语言的设计思想和PHP