我曾经写过两篇关于PHP“死亡”的文章,第一篇文章证明了PHP不会在一夜之间消失,因为它几乎支配着整个互联网,但是它会慢慢消亡,主要原因是缺乏竞争性特性。
第二篇文章探讨了编程语言“死亡”概念的更多内容。它们并不会消亡,而是被新范例的继承语言所取代,我们可以认为这些是后继语言。是的,还有COBOL程序员,但没有新项目是以COBOL为主。
这篇文章超越了死亡的概念。为什么会有人不使用PHP,当有一些时髦的编程语言在过去几年中获得了名声?
只是PHP而已
编程101的前几分钟,给那些认为自己是下一个比尔·盖茨、埃隆·马斯克或乔治·霍茨的冒险家介绍:这不是关于语言,而是关于适合工作的正确工具。
PHP确实是一个非常成熟的Web开发工具。有一些很棒的框架,如Symfony,Laravel,CodeIgniter,甚至是Zend Framework的前身Laminas。还有整个生态系统不仅建立在PHP之上,而且解决了一些自从创建以来语言一直存在的问题,如Revolt,Open Swoole和Roadrunner。
每种语言在超出其舒适区时都会出现问题。你可以说PHP本身是制作网站的好语言,只有傻瓜才会争辩。但是,把PHP放在CLI上,它就不那么好了。将PHP放在网络、多线程、二进制数据处理以及远离HTTP请求的一切中,并且你会看到裂缝出现。PHP可以在这些场景中工作,但变得不那么方便和不透明。
因为这些裂缝而发表“PHP已死”的言论非常幼稚。这就像在推特上嘲笑兰博基尼无法在10秒内通过岩石实现0-100英里/小时的速度。这很疯狂,但是也有人是反对疫苗的。
PHP不能做到所有的事情。没有一种语言可以。
在2020年调查了一些现今仍然流行的编程语言后,我无法想象只使用一种语言来做所有的事情,即使许多公司都喜欢使用单一的堆栈,这也几乎是不可能的。你可以尝试使用Javascript,它可以在前端和后端工作,但那只是一厢情愿。
让我们进入兔子洞。正如你现在可能已经意识到的那样,PHP(仍然)很适合处理基本的Web核心,但与其他语言相比,它仍然无法跟上新技术和良好的性能。直到今天,你仍然需要Web服务器来为PHP进程提供服务,因为Web服务器会处理比PHP更多的套接字、网络和进程管理。
这种“跟不上”的最明显的例子就是WebSockets。PHP可以处理WebSockets,但与像Node.js这样的其他语言相比,它的性能不那么出色,因为有很多看不见的开销。
因为Javascript易于访问,而Node.js相对性能较好,所以有可维护的实现提供了一些基本的WebSockets功能,例如ws库。
现在,在网络方面,深入探究套接字处理、内存管理和微观优化,你会发现自己远离像PHP、Javascript、Python等动物一样的语言。但这并不意味着这些动物不能互补。
例如,soketi。这个NPM包仅仅是一款可以流畅地提供_Pusher协议兼容_WebSockets服务器的工具。它的秘密酱是µSockets,它的网络基础。除了可疑的事件之外,这是一款用C++编写的软件,但编译后成为一个Node.js核心库,以JavaScript对象的形式公开。
这并不是关于“Node.js更好”的例子。这是关于一个简单的事实,即你无法用高级语言打败低级语言。高级语言以方便性为代价换取开销和不透明度,而低级语言以性能和控制为代价换取管道。
当然,如果它仍然是C++库,那么没有人会将其用于Web开发,因为用C++创建网页就像用牙刷刷墙一样。使其如此_开发者友好_的关键是将其移植并暴露给高级语言,这可以用于Web开发。毫无疑问,如果例如将其作为扩展移植到PHP中,它可能会在Node.js社区之外获得相同的效果,但我非常怀疑它是否会获得更多。
那边的草更绿
让我们稍微回到硬转弯。老板要求更加精细的工具,例如一种不必每个流都消耗128MB就可以流式传输视频的工具,这将降低服务器账单。
当你需要大量关注网络、内存、文件系统甚至在某种程度上关注数据库时,我认为这是_启示录的四骑士_,高级语言就退居二线了。从原始的C语言,经过永恒的C++,到最近的类似于Rust和Go的想要成为继承者的语言。这些工具的问题在于它们可靠地完成的工作。尝试使用 Rust 或 Go 制作网页并没有什么害处,甚至有针对它们的框架,但你应该考虑它们远远不如其他语言提供的便利。就像有人在看 F1 赛车时对我说的那样,“司机没有设计赛车的原因就是工程师没有驾驶赛车的原因”。
对于 Rust 这种看起来更低级、与 C++ 相当的语言来说,它是一种正在日益受到关注的优秀编程语言,可能它的突破在于成为 Linux 内核可接受的语言。谁知道未来 Node.js 和 PHP 是否会用现代的 Rust 交换它们的 C 核心。
另一方面,Go 看起来像是副驾驶。它不处理内存管理,因为它有自己的垃圾回收器,并且在不产生极大开销的情况下提供了很多方便的协作多线程,这是很难利用的——这可能是为什么单线程高级编程语言对任何开发人员都如此有吸引力的原因。这里有过多的管道和控制,但它仍然是一个出色的工具,用于构建需要扩展的特定多任务软件。这就是 Go 的用途。
例如,我可以使用 PHP 和 MySQL 制作一个网页,用户可以获得“票”以便能够流式传输视频。Go 服务器将检查票证并流式传输视频文件的块,这些文件已经在后台通过 Rust 转码器进行了转码。在 PHP 上尝试做到这一点?不可能。在 Go 上?需要很多年。在 Rust 上?需要几十年。
除非大错特错,否则不会死去
PHP 是否正在死亡?在 Web 上它不会,只要 PHP 基金会 有能干的人,它就可能有长久的生命,直到下一个“大事件”到来(谁说的是 VR 而不是网页?)。我们可以感谢 PHP 7 和 PHP 8,因为这些版本使语言没有像 Adobe Flash 那样成为一个资源猪,否则现在每个人都会使用 Node.JS。
当然,PHP 在非 Web 领域没有任何空间,像 Rust、Go、Node.js 和 Python 这样的工具确保它不会很快失去它们的工作。可以放心,除非它们具有 PHP 不提供的特定功能集,否则没有人会想用前面提到的替代方案来制作网页。即使在这种情况下,最好也是寻找一个 PHP 项目的补充,而不是完全放弃 PHP。
我通过艰苦的方式学到了,今天还没有“做得好”的语言。选择正确的工具比使用一个工具完成所有工作更好,即使你对其他工具不太熟悉。在这个过程中,你可能会了解你错过的东西。
你可以用螺丝刀将钉子钉进木头里,但肯定会希望使用锤子,在不到一半的时间和精力的情况下完成工作。没有人认为使用螺丝刀是“过时”的,因为这个原因。
如果你认为这很疯狂,那就试着用锤子拧螺丝吧。
译自:https://darkghosthunter.medium.com/two-years-from-php-dying-there-are-other-tools-77730387e2ff
评论(0)