PHP 是否正在死去?

PHP

作为一个早期把 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 从来没有想过成为主流,它只是想把自己分内那点活干好,然后拂袖而去,深藏功与名。

已有 12 条评论
  1. 新项目都是go写的,php写的老代码逐渐被替换,或者不动

      1. 玉米爷爷
        玉米爷爷

        作为以视觉设计和产品宣传为主的领域,我还是独爱PHP,只要web不死,PHP就不会死。。。

  2. PHP 作为小流量网站还是具备优势的,像博主所言,使用门槛较低,新手都可以快速学习,这是其他语言/框架目前没法做到的事情

  3. PHP 的特性也无意给我带来了挑战,我想做一个长链接服务推送即时变化给页面,貌似 PHP 原生的方式就并不能很好的做到这个

  4. ssl过期了

  5. 大佬,有空可不可以帮忙处理个type的小问题,谢谢啦!

      1. 你可以在 GitHub 上提出问题

          1. 我提过,但是问题比较小众吧,问题不容易复现,一直没有解决!

  6. 大概问题和github上#794类似。就是使用postgresql换14.6环境下新建文章时分类和标签无法记录。在编辑草稿状态下能够单独实现。应该是有一处postgresql的兼容小问题。

      1. 你提的那个 issue 编号是多少,是否可以复现

          1. 我给你发一封邮件,有空的时候拜托帮我看看,主要我是纯小白,谢谢啦!

  7. 一只很大的菜鸟
    一只很大的菜鸟

    我还正在学呢,都在说快日落西山了😦