PHP的前世今生

Stella981
• 阅读 902

大家都知道,Facebook、淘宝等早期都是用PHP写的,在中国,PHP在百度、新浪、腾讯这三大互联网公司中应用比较多。

自1995年由丹麦人Rasmus Lerdorf(雷斯莫斯·勒道夫) 创建 PHP 以来, PHP 语言经历了激烈的演进。

PHP/FI - 1995年

摘要:用Perl写的小工具

PHP 继承自一个老的工程,名叫 PHP/FI。PHP/FI 在 1995 年由 Rasmus Lerdorf 创建最初只是一套简单的 Perl 脚本,用来跟踪访问他主页的人们的信息。它给这一套脚本取名为“Personal Home Page Tools”。

PHP的前世今生
Rasmus Lerdorf(雷斯莫斯·勒道夫)

PHP/FI 2.0 - 1997年11月

摘要:用C语言重写了PHP/FI

到1997年,PHP/FI 2.0,也就是它的 C 语言实现的第二版在全世界已经有几千个用户(估计)和大约 50,000 个域名安装,大约是 Internet 所有域名的 1%。但是那时只有几个人在为该工程撰写少量当代码,它仍然只是一个人的工程。PHP/FI 2.0 在经历了数个 beta 版本的发布后于 1997 年 11 月发布了官方正式版本

PHP3 - 1998年6月

摘要:两位以色列开发者加入,重新命名

PHP 3.0 是类似于当今 PHP 语法结构的第一个版本。两位以色列人Andi Gutmans 和 Zeev Suraski 在为一所大学的项目中开发电子商务程序时发现 PHP/FI 2.0 功能明显不足,于是他们重写了代码。这就是 PHP 3.0。经过Andi,Rasmus 和 Zeev 一系列的努力,考虑到 PHP/FI 已存在的用户群,他们决定联合发布 PHP 3.0 作为 PHP/FI 2.0 的官方后继版本。而 PHP/FI 2.0 的进一步开发几乎终止了。

PHP 3.0 的一个最强大的功能是它的可扩展性。除了给最终用户提供数据库、协议和 API 的基础结构,它的可扩展性还吸引了大量的开发人员加入并提交新的模块。后来证实,这是 PHP 3.0 取得巨大成功的关键。PHP 3.0 中的其它关键功能包括面向对象的支持和更强大和协调的语法结构。

这个全新的语言伴随着一个新的名称发布。它从 PHP/FI 2.0 的名称中移去了暗含“本语言只限于个人使用”的部分。它被命名为简单的缩写“PHP”。这是一种递归的缩写,它的全称是——PHP: Hypertext Preprocessor。

约九个月的公开测试后,官方于 1998 年 6 月正式发布 PHP 3.0。

PHP的前世今生
Andi Gutmans(安迪·古特曼斯)

PHP的前世今生
Zeev Suraski(齐弗·苏拉斯基)

PHP4 - 2000年5月

摘要:引入“Zend Engine”并成立了Zend公司

1998 年的冬天,PHP 3.0 官方发布不久,Andi Gutmans 和 Zeev Suraski 开始重新编写 PHP 代码。设计目标是增强复杂程序运行时的性能和 PHP 自身代码的模块性。PHP 3.0 的新功能和广泛的第三方数据库、API的支持使得这样程序的编写成为可能,但是 PHP 3.0 没有高效处理如此复杂程序的能力。

新的被称为“Zend Engine”(这是 Zeev 和 Andi 的缩写)的引擎,成功的实现了设计目标,并在 1999 年中期首次引入 PHP。基于该引擎并结合了更多新功能的 PHP 4.0,在 PHP 3.0 发布两年后,于2000年5月发布了官方正式版本。除了更高的性能以外,PHP 4.0 还包含了其它一些关键功能,比如:支持更多的 web 服务器;HTTP Sessions 支持;输出缓冲;更安全的处理用户输入的方法;一些新的语言结构。

Zend是PHP公司,成立于1999年,由Zeev Suraski and Andi Gutmans两位开源PHP的缔造者和建筑师共同创建,因此有了Zend名称的由来。由于他们的国际技术的权威性,Zend公司和他的创建者在PHP以及开源团体中持续处于领导的核心地位,对于PHP的迅猛发展起到了强力推动作用。Zend公司是一个PHP应用的企业和个人都可以寻求到专业技术解决方案的PHP领先公司。
——摘自百度百科

PHP5 - 2004年7月

摘要:PHP面向对象

PHP 5 在长时间的开发及多个预发布版本后,于 2004 年 7 月发布正式版本。它的核心是 Zend 引擎 2 代,引入了新的对象模型和大量新功能。

虽然 PHP 5.0 没有带来实质性的性能提升,并且在某些情况下甚至比 PHP4 更慢,一个由 Dmitry Stogov 领导的团队在社区的大力帮助下已经在后续版本中不断优化语言,在 PHP 5.6 发布的时候,在大多数情况下,性能提升在 1.5x 和 3x 之间。

PHP NG - 2014年

摘要:废弃的PHP6和寄希望于下一代的PHP NG分支

 PHP6 的开发开始于2005年,曾立志要让PHP支持Unicode字符串。但是它的进展过于缓慢又出现了很多的问题,然而开发停滞不前,PHP 6计划在2010年被取消了。由于PHP6的分支被占用了,不久后Zend的Dmitry Stogov 发布了PHP的一个名为PHPNG(PHP Next-Gen)的分支。

PHP NG (你要愿意的话叫 PHP 5.7 也行)关键是仍保持对 PHP 5.6 的兼容性。

俄罗斯人Dmitry Stogov 在2014年年1月中旬的 首次发布 以及5月初的 里程碑更新 后对 PHP 速度的提升有着越来越多的思路(特别贡献者来自 中国人Xinchen Hui , Nikita Popov 等).

到了7月中旬这些努力终于有了结果,测试表明开发中的版本性能对比 PHP 5.6 有着近乎 1 倍的提升。测试是在渲染 WordPress 3.6 前端页面上进行的。

同样的页面,PHP 5.6 渲染 1000 次耗时 26.756 秒,而 PHP NG 耗时 14.810 秒。

此次性能提升的秘诀在于将近 60% 的 CPU 指令被替换成更高效的代码。PHP 5.6 执行 100 次渲染需要 9,413,106,833 个 CPU 指令,而 PHP NG 只需 3,627,440,773 指令。

因为多数扩展都可支持 PHP NG,因此你可以轻松的构建自己的环境进行测试。

PHP7 - 2015年12月

摘要:性能对比 PHP 5.6 有着近乎 1 倍的提升

PHP 7基于PHP NG项目(PHP Next-Gen),自从PHP NG开源且合并为PHP 7后,性能就持续增长和改善,它通过Zend加速PHP,使得PHP 7性能有很大提升。2015年,基于PHPNG项目(PHP Next-Gen)PHP7正式发布。主要目的在于提升PHP性能。

PHP的前世今生
(Dmitry Stogov)德米特里·斯托戈夫

PHP的前世今生
惠新宸

2015 年 12 月, PHP 7.0 取得了重大突破。 2016 年 12 月,7.1 版本也带来了一系列增强功能。目前,PHP7有3个功能版本,分别是7.0.x,7.1.x,7.2.x,开发者该如何选择它们呢?

  • PHP7.0.x相对于之前的版本主要是性能上进行了提升,官方公布的数据性能可以提升一倍。
  • PHP7.1.x更多的是对7.0.x未完成的工作的一个补充。
  • PHP7.2.x 相对于 PHP7.1.x 主要优化也是在 opcache。

这样说大家应该明白了吧。

PHP 7.1 相比 7.0 来说,做的最大的工作,就是一个类型推断系统加一个类型相关的中间代码执行引擎。这个不是新的工作,在2013年我们做 PHP 5.5 的 JIT 的时候类型推断系统已经做出来了,但当时把这个项目停掉了,现在把那项工作其中的类型推断部分拿过来,放到 7.1 。基于这个类型推断未来还可以做更多的东西。PHP 7.1 更多的是对 7.0 未完成的工作的一个补充。

番外篇:Fackbook的HHVM

在2008年,Facebook 启动了一项工作,计划开发一个工具 将 PHP 脚本转换成 C++,这样就可以被编译后在 web 服务器上运行。目的是节省服务器资源,这是一个很重要的目标,因为 Facebook 的用户量正在快速增长。从这个意义上讲,这个项目是成功的,因为它可以让服务器处理之前五到六倍的请求量。

时间回到2010年,Facebook 的服务器需求已经增加了很多,是时候考虑用新的创新来提升更大的效率。基于这个需求,Facebook 开发了 HHVM (HipHop Virtual Machine) — 一个运行 PHP 代码的虚拟工具。

HHVM 使用了 Just-In-Time (JIT) 编译方式将 PHP 代码转换成某种字节码。接下来把字节码再转换成机器码并进行优化,让它尽可能快的运行。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
PHP+jQuery寥寥几行代码轻松实现百度搜索那样的无刷新PJAX的分页列表和导航链接
!(https://static.oschina.net/uploads/space/2016/1208/171419_U00R_561214.png)PHP寥寥几行代码轻松实现百度搜索那样的分页列表和导航链接,某些语言的拥趸哭晕在厕所.<?php$apparray('db_prefix''
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这