PHP 真的不行了?透过 PHP 的前世今生看真相
大家好,我是码农先森。
1994年我出生在湖南的农村,就在同年加拿大的拉斯姆斯·勒多夫创造了 PHP,这时的 PHP 还只是用 Perl 编写的 CGI 脚本。或许是时间的巧合 PHP 变成了我后半生谋生的手段,当时拉斯姆斯·勒多夫写这些脚本的目的,只是为了统计自己网站的访问者。就是这样一个简单的目的就诞生了「世界上最好的语言 PHP」,伟大的事业往往是最简单的开始。这些用 Perl 编写的 CGI 脚本,可以认为是 PHP 的雏形,亦或是称为 PHP 的第一个版本「PHP1.0」也不为过。
据说下面这段代码是 PHP 第一个版本,不知大家有没有似曾相似的感觉。
<!--include /text/header.html-->
<!--getenv HTTP_USER_AGENT-->
<!--ifsubstr $exec_result Mozilla-->
Hey, you are using Netscape!<p>
<!--endif-->
<!--sql database select * from table where user='$username'-->
<!--ifless $numentries 1-->
Sorry, that record does not exist<p>
<!--endif exit-->
Welcome <!--$user-->!<p>
You have <!--$index:0--> credits left in your account.<p>
<!--include /text/footer.html-->
也就在这一年,网景公司(Netscape)发布了 Navigator 浏览器0.9版,这是历史上第一个比较成熟的网络浏览器,一经发布则轰动业界,成熟的网络浏览器为 PHP 的快速发展提供了天然的优质土壤。
次年,拉斯姆斯·勒多夫发布了 PHP2.0 这个版本它不仅可以访问数据库,还能嵌入 HTML 中动态处理数据。新的特性吸引了一批 PHP 的爱好者,其中也包括了后来加入到了 PHP 核心开发组的 Zeev Suraski(泽埃夫·苏拉斯基)和 Andi Gutmans(安迪·古曼兹),著名的「Zend VM 引擎」便是由这两名开发者所主导开发的。
时间来到了1998年底,中国的即时通讯也在这时开始崛起,最典型的就是 OICQ 也就是 QQ 的前身。这时的 PHP3.0 官方版本也正式发布,这个版本最强的特性是它的可扩展模块,这点吸引了大量的业余开发者提交了新的扩展,这同时为 PHP 生态的发展埋下了深深的根基,以至于后续出现的 Swoole 异步通信扩展也是得福于此。
两年之后,在千禧之年「2000年」这也是互联网泡沫刚刚破灭的第一年。PHP4.0 发布了,这个版本首次推出了由 C 语言编写的 Zend VM 虚拟机引擎,新程序的运行性能相较于之前提升了近十倍。此外,语法上还引入了类和对象的支持,这便是面向对象特性的最初模样。
在国内非典还盛行的时期「2003年」,一个基于 PHP 开发的开源内容管理系统 WordPress v1.0 正式发布,一经发布就得到广大开发者的喜爱,让搭建网站博客的门槛极大的减低。根据目前最新统计,WordPress 的市场份额持续增长,已达到惊人的 46%,成为全球最流行的 CMS。这意味着在互联网上,大约有一半的网站都是使用 WordPress 创建的。可想而知看现有的数据就可以推测出当时的 WordPress 热度高涨,这也同时推动了 PHP 的广泛传播。还记得有次改写 WordPress 的源代码,习惯了面向对象编程的我,在面向过程的源代码面前仿佛被乌云笼罩,久久无法下手,不知 PHPer 有没有同感?
非典刚刚结束的次年「2004年」,新时代的 PHP5.0 正式发布,这是一个 PHP 跨时代的到来。并且之后多年里 PHP 一直在 v5 的版本上迭代,是 PHP 发展史上历时最长的一个大版本,这个版本里全面引入了面向对象特性,并且将 Zend VM 虚拟引擎升级到了第二代,使其性能得到显著的提升。
在 PHP5 发布的第三年「2006年」,国产 PHP 开发框架 ThinkPHP 诞生「当时的框架原名还是 FCS」,ThinkPHP 的发布惠及了国内大量的 PHP 开发者。其中我的处女项目就是用的 ThinkPHP3.2 开发的,相信有很多的 PHPer 也和我一样,吃到了这个国产框架的红利。但也是由于国产框架的推出,让 PHP 开发项目的门槛进一步的减低,吸引了大量非科班专业的人转行从事 PHP 开发,从而也造成了如今 PHP 开发者的技术水平层次不齐的局面。
PHP 长期以来的应用场景都是聚焦于 CMS 内容网站的建设,以至于在异步通信领域无所建树。直到 2012 年 Swoole 开始发布第一个版本,虽说刚开始的 Swoole 并不完美,但也填补了 PHP 在异步网络通信领域的空白。同时让 PHP 也能在实时通信、物联网通信、游戏开发等领域大展拳脚,在 PHP 的发展上做到了锦上添花。就在同年 Go 语言正式的第一个版本 v1.0 横空出世,标志着 Go 语言正式走向成熟,在往后的多年里一直备受编程界的强烈关注。Go 语言以高性能而闻名于世,而 PHP 在高性能方面存在着明显的短板,这也为多年以后 PHPer 转型 Go 语言而埋下了伏笔。
PHP 经过在 v5 版本上长达十多年的迭代,终于在2015年底正式发布了 PHP7,这是 PHP 一次质的飞跃。大家都知道改革开放对中国的经济产生了重大的影响,同样 PHP7 在 PHP 的发展史上也是产生了同等级别影响。同时让我们值得骄傲的是中国新浪微博工程师惠新辰「俗称鸟哥」,也是唯一的一名中国人成为了 PHP7 的核心发起人之一。PHP7 的问世让新浪微博系统的性能也得到了大幅度的提升,其实新浪微博平台第一代架构采用的是 LAMP 架构,后台系统的开发语言使用的是 PHP,此外还有很多平台最开始使用的也是 PHP 进行开发的,比如脸书FaceBook、阿里巴巴的淘宝、百度、腾讯等,这一点也足以证明 PHP 当时的火爆程度。
当我们还在受新冠疫情的困扰,每天核酸不断。而 PHP8 已在2020年底悄然发布,作为一个大版本的更新。其最大的亮点是引入了 JIT 编译技术,该技术能够在 PHP 代码执行时编译成机器码,而不是每次运行时都需要解释执行。JIT 编译技术提高了代码的执行效率,使得 PHP 运行更快,性能提升尤其显著,大幅度改善了 PHP 的执行性能。简而言之,PHP8 为 PHP 生态系统注入了强劲的动力。
现如今虽说疫情已经离我们远去,但疫情对全球经济影响仍在持续,加上某些国家的局部动荡,导致了全球经济的连续下滑。在这样的大背景下,我们所处的互联网行业也不容乐观,国内互联网公司裁员风波肆起,这也间接导致了程序员之间的内卷加剧。经济好比是一块蛋糕,经济萎靡不振蛋糕则会越来越小。程序员无法外展,那么只能内卷,更何况 PHP 一直处于被鄙视链的边缘,很多做 Java、C/C++、Go 等语言的就自认为更高级技术更牛,随着被其他语言的挤兑歧视,这也让长期只从事 PHP 开发的程序员被迫淘汰出局。我想这便是,如今被人认为 PHP 没落的真实原因吧?
幻想一下,如果回到疫情之前,世界经济持续高涨。国内的互联网行业也还是如火如荼,中小企业也蓬勃发展、生机盎然,呈现着一片繁荣的景象。那我想必 PHP 还是会在编程语言排行榜上持续霸榜,不至于跌落到前十开外吧。从所周知很多国内外的知名大公司也是缘于 PHP 起步的,同时也让 PHP 相关的从业者受益匪浅。从过往来看 PHP 对互联网行业所带来贡献,也足以对得起网络上一直流行的称号「PHP是世界上最好的语言」。
有次在 v2ex 社区上看到有位网友发布了一个帖子,其主要内容是感谢 PHP 给他带来的收益,让他一个前端的切图仔,也能上手使用 PHP 做后端开发,促使他接了很多的外包项目获得了可观的回报。但有人反驳说了,一个拧螺丝的打工仔,还感谢起扳手来了?但我想说的是如果连扳手都没有,那你可能连拧螺丝的机会都没有。纵观 PHP 这些年的发展也是在逐渐的迎合开发者,有些语言出身就在罗马「Go 语言出自谷歌的 C 语言之父」,而有些语言则在出身普通,势必会带来不一样的成长路径和结果。
时代造就了马云,同样也成就了 PHP。PHP9 还在紧锣密鼓的开发中,据说为了更好的性能,会引入类似 async/await 原生异步编程的方式,这对于 PHP 来说将是一种前沿且高效的编程模式。最后,随着世界经济的逐步恢复,互联网行业的不断迭代创新。PHP 也会焕发新生若在其坚守易用性、灵活性之外,再加强在高性能方面的建树,势必会稳稳地屹立在 Web 开发之巅不可动摇。
众人拾柴火焰高,PHP 程序员应该要抱团取暖勇度寒冬,努力推动 PHP 生态的建设。早日让众多唱衰「PHP不行了」的声音消失殆尽,并重回巅峰时刻。
感谢大家阅读,与君共勉。
欢迎关注、分享、点赞、收藏、在看,我是微信公众号「码农先森」作者。
PHP 真的不行了?透过 PHP 的前世今生看真相的更多相关文章
- 如果Android真的收费了,你怎么看?
前言 今天突然看到一群里有人发了下面这样一张图片,然后群里又炸了! 于是又和同事讨论了android收费的问题,然后隔壁正在玩农药的UI妹子就笑了... 没错! 安卓可能要收费了!安卓可能要收费了 ...
- 透过WinDBG的视角看String
摘要 : 最近在博客园里面看到有人在讨论 C# String的一些特性. 大部分情况下是从CODING的角度来讨论String. 本人觉得非常好奇, 在运行时态, String是如何与这些特性联系上的 ...
- javascript真的是异步的吗?且看setTimeout的实现原理以及setTimeout(0)的使用场景
在今天之前我一直以为setTimeout这个函数是异步的,无意中看到了一篇关于setTimeout的文章.发现自己曾经的认识全是错误的,赶紧总结下. 先看一段代码: var start = new D ...
- 你真的了解CSS继承吗?看完必跪
也许你瞧不起以前的 css ,但是你不该再轻视眼下的 css .近年来 css 的变量系统已逐步得到各大浏览器厂商支持,自定义选择器等强势袭来,嵌套系统/模块系统也在路上…为了更好的掌握 css 这门 ...
- Scrum已经俘获中国开发者的心? ——从《2017年开发者调查报告》看真相!
云栖社区通过为期两个月,对7032份有效调查问卷分析统计,2017年12月发布了首份<2017中国开发者调查报告>.报告显示,37.3%的开发者表示,协作工具主要来自企业内部自研的协作工具 ...
- 【Bug】看不见的分隔符: Zero-width space
今天在调试一段代码的时候,有一个输入不能为空的库函数抛出了异常(为空就会抛出异常,就是这么傲娇).自己暗骂了自己一番,怎么这么大意,于是追溯源头,开始寻找输入控制的地方.但是当我找到时我惊呆了,我明明 ...
- [BUG随想录] 看不见的分隔符: Zero-width space
今天在调试一段代码的时候,有一个输入不能为空的库函数抛出了异常(为空就会抛出异常,就是这么傲娇).自己暗骂了自己一番,怎么这么大意,于是追溯源头,开始寻找输入控制的地方.但是当我找到时我惊呆了,我明明 ...
- THUPC2018看题总结
THUPC2018看题总结 #6387. 「THUPC2018」绿绿与串串 / String 据说是签到题啊. 首先根据题目的意思,我们发现如果能找到那个最后一次选择的对称轴岂不是美滋滋. 自然地,我 ...
- 是的 你没看错!!!用JAVA为MCU开发物联网程序?
是的 你没看错!!!用JAVA为MCU开发物联网程序? 一直以来,物联网设备这种嵌入式硬件,对于Java软件开发者来说,就是Black Magic Box,什么中断.寄存器,什么 ...
- 看完了进程同步与互斥机制,我终于彻底理解了 PV 操作
尽人事,听天命.博主东南大学硕士在读,热爱健身和篮球,乐于分享技术相关的所见所得,关注公众号 @ 飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步 本文已收录于 CS-Wiki(Gitee 官 ...
随机推荐
- ContextCapture中的模型航拍方法和技巧
在进行实景建模之前,获取被拍摄物体的照片是很重要的一项工作,因为如果没有按照规则拍摄或者拍摄相片质量不佳,将会直接影响我们后期建模,甚至无法建模. 我们建议使用ContextCapture进行建模,则 ...
- 【U8】 生产订单下bom 提示 “遇到以0做除数错误”错误
一个虚拟件子件的子件为无换算率存货,bom中对应的换算率.辅助基本用量为0,修改为null后正常. 对应 bom_opcomponent表的 ChangeRate 换算率 AuxBaseQtyN 辅助 ...
- ISCC 2024 练武题 misc趣题记录
Number_is_the_key 题目 The answers to the questions are hidden in the numbers. 文件是空白的xlsx文件 我的解答: 乱点发现 ...
- 到今天了你还不会集合的Stream操作吗?你要out了
Java8的两个重大改变,一个是Lambda表达式,另一个就是本节要讲的Stream API表达式.Stream 是Java8中处理集合的关键抽象概念,它可以对集合进行非常复杂的查找.过滤.筛选等操作 ...
- Linux之top命令分析
第一行: top - 04:25:26 当前系统时间 up 3 min, 系统已经运行的时间(不间歇的运行) 1 user, 当前登录系统的用户数 load average: 0.01, 0.03, ...
- LLM 大模型学习必知必会系列(三):LLM和多模态模型高效推理实践
LLM 大模型学习必知必会系列(三):LLM和多模态模型高效推理实践 1.多模态大模型推理 LLM 的推理流程: 多模态的 LLM 的原理: 代码演示:使用 ModelScope NoteBook 完 ...
- NOIP模拟60
T1 整除 解题思路 答案就是 n 的每一个质因数的合法的答案数相乘(证明的话就....) 但是复杂度显然不允许(虽然我们可以给指数取模水过去).. 可以用积性筛(线性筛)利用质数筛出 \(x^m\) ...
- 8.24考试总结(NOIP模拟47)[Prime·Sequence·Omeed]
时间带着明显的恶意,缓缓在我的头顶流逝. T1 Prime 解题思路 成功没有签上到... 一看数据范围 \(R-L+1\le 10^7,R\le 10^{14}\) ,这肯定是判断范围内的数字是否可 ...
- umount 报错umount: /new_room: target is busy. (In some cases useful info about processes that use the device is found by lsof(8) or fuser(1))
挂载逻辑卷后,尝试更新逻辑卷的文件系统 [root@server lost+found]# umount /new_room/ umount: /new_room: target is busy. ( ...
- JavaScript语法形式1行内式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...