【百科精讲】PHP是啥?

PHP(PHP: Hypertext Preprocessor)即“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法学习了C语言,吸纳JavaPerl多个语言的特色发展出自己的特色语法,并根据它们的长项持续改进提升自己,例如java的面向对象编程,该语言当初创建的主要目标是让开发人员快速编写出优质的web网站。 [1-2]PHP同时支持面向对象和面向过程的开发,使用上非常灵活。

相关星图

查看更多

常见的脚本语言

共10个词条3.0万阅读

C Shell

让用户更容易的使用交互式功能

JavaScript

一种解释性脚本语言

Nuva

一种面向对象的动态脚本语言

perl

一种功能丰富的计算机程序语言

2019年TIOBE 12月编程语言前20排行

共20个词条40.2万阅读

Java

简单性、面向对象、分布式等特点

C语言

以简易的方式编译、处理低级存储器

Python

解释性、互动性和面向对象的脚本语言

C++

擅长面向对象程序设计

软件名称

PHP

软件平台

WindowsLinuxUnixmacOS等 [3]

上线时间

1995年

最近更新时间

2024年7月4日 [44]

软件语言

PHP

开发商

THE PHP Group

软件授权

Creative Commons Attribution [4]

软件版本

v8.3.9 [44]

软件大小

16 至 26 MB

发展历程

播报

编辑

PHP是一个拥有众多开发者的开源软件项目,最开始是Personal Home Page的缩写,已经正式更名为 "PHP: Hypertext Preprocessor"。PHP是在1994年由Rasmus Lerdorf创建的 [29],最初只是一个简单的用Perl语言编写的统计他自己网站访问者数量的程序。后来重新用C语言编写,同时可以访问数据库,1995年,PHP(Personal Home Page Tools)对外发表第一个版本PHP1。此后,越来越多的网站开始使用PHP,并且强烈要求增加一些特性,如循环语句和数组变量等,1995年发布的PHP2加入了对mySQL的支持。

Andi Gutmans和Zeev Suraski在为一所大学的项目中开发电子商务程序时发现PHP2功能明显不足,于是他们重写了代码发布了PHP3。PHP3是类似于现代PHP语法结构的第一个版本,PHP3的最强大的功能是它的可扩展性,PHP3的新功能和广泛的第三方数据库、API的支持使得这样程序的编写成为可能。

PHP3官方发布不久,Andi Gutmans和Zeev Suraski开始重新编写PHP代码。设计目标是增强复杂程序运行时的性能和PHP自身代码的模块性。经过不懈努力Zend引擎研发成功并且实现了设计目标,并在1999年中期引入 PHP。基于该引擎并结合了更多新功能的 PHP4于2000年5月正式发布。除了更高的性能以外,PHP4还包含一些关键功能,比如:支持更多的 web 服务器、HTTP Sessions 支持、输出缓冲、更安全的用户输入和一些新的语言结构。

PHP5于2004年7月正式发布,它的核心是Zend引擎2代(PHP7是Zend加强版3代),引入了新的对象模型和大量新功能,开始支持面向对象编程。随着PHP6经历长时间的开发流产后,PHP5发布了6个版本顽强的支撑着开源社区的发展,直到2015-12-03那天迎来了PHP 7.0的发布,其实PHP5.6已经包含了很多PHP6想实现的特性,它为PHP7的研发争取了宝贵的时间。不负众望PHP7.0对比PHP5.6性能整整提升了2倍,PHP7的成功发布让很多核心开发成员回归到PHP社区,并且在2020-11-26发布了PHP8。和php7系列相对比,PHP8对各种变量判断和运算采用更严格的验证判断模式,这点有利后续版本对jit的性能优化。

PHP语言作为一种高级语言,其特点是开源, 在设计体系上属于C语言体系,它可以让很多接受过高等教育的初学者能很快接受并完成入门学习,简单好上手容易找工作自然粉丝多。如果数据量大及访问压力大,可以集成redis、mysql分表分区分库、elasticsearch搜索引擎、消息队列写保护和php系统分布式集群部署等技术方案,缓解数据存储、服务访问和数据检索带来的巨大压力。

无论是大中小型项目,PHP都是一个十分适合的高级编程语言,是否适合就看项目研发团队的对它的掌握程度。 但是对于较大的和更为复杂的项目,最常见的php-fpm编程模式就显出它的薄弱了。针对PHP-fpm暴露出的一系列缺点问题,最简单靠谱的方案就是及时升级兼容PHP的高版本,PHP7.0.0 [13]对比PHP5.6性能提升了2倍,另外PHP7.4提供的Preloading预加载机制 [10]实现了部分程序常驻内存,获取了不错的性能提升,在PHP8又提供了高效的JIT (Just-In-Time即时编译) [11]运算支持。另外水平更高的开发者可以转向难度更高的php-cli编程,它能解决大部分的系统性能问题,无论是PHP7和PHP8都支持这种模式的编程。

经过二十多年的发展,随着php-cli相关组件的快速发展和完善,PHP已经可以应用在 TCP/UDP服务、高性能Web、WebSocket服务、物联网实时通讯、游戏、微服务等非 Web 领域的系统研发。 [19]

根据W3Techs2019年12月6号发布的统计数据,PHP在WEB网站服务器端使用的编程语言所占份额高达78.9% [21]。在内容管理系统的网站中,有58.7%的网站使用WordPress(PHP开发的CMS系统),这占所有网站的25.0%。 [18]

2023年11月,PHP 8.3发布。 [43]

语言特点

播报

编辑

开源免费

PHP是一个受众大并且拥有众多开发者的开源软件项目,Linux + Nginx + Mysql + PHP是它的经典安装部署方式,相关的软件全部都是开源免费的,所以使用PHP可以节约大量的正版授权费用。不过PHP作为一个开源软件,它缺乏大型科技公司的支持背景,网络上对它的唱衰也是经久不衰,不过它的持续迭代和性能持续增强的现实却是鼓舞人心的,PHP社区用实际行动给予各种质疑强有力的回击。

快捷高效

PHP的内核是C语言编写的基础好效率高,可以用C语言开发高性能的扩展组件;PHP的核心包含了数量超过1000的内置函数,功能应有尽有很全面,开箱即用程序代码简洁; [25]PHP数组支持动态扩容,支持以数字、字符串或者混合键名的关联数组,能大幅提高开发效率; [26]PHP是一门弱类型语言,程序编译通过率高,相对其他强类型语言开发效率快;PHP天然热部署,在php-fpm运行模式下代码文件覆盖即完成热部署;PHP经过20多年的发展,在互联网上可以搜到海量的参考资料供参考学习。

性能提升

PHP版本越高它的整体性能越高,根据官方介绍,PHP7.0.0 [13]对比PHP5.6性能就提升了2倍,PHP7.4已经比PHP7.0快了约30%,PHP8.0在性能上又相对PHP7.4大约改进了10%。PHP 8.0 引入了 JIT编译器特性,同时加入多种新的语言功能,例如命名参数、联合类型、注解、Constructor Property Promotion、match 表达式、nullsafe 运算符以及对类型系统、错误处理和一致性的改进。PHP拥有自己的核心开发团队,保持5年发布一个大版本、1个月发布2个小版本的频率,最新的版本是PHP8.08 [14]。PHP 7.0.0 [15]发布于2015-12-03,此版本下最新版本是PHP 7.4.21 [17](发布日期:2021-07-01),PHP 8.0.0 [16]发布于2020-11-26,此版本下最新版本是PHP 8.0.8(发布日期:2021-07-01)。

跨平台

每个平台都有对应的php解释器版本,指针对不同平台均编译出目标平台的二进制码(PHP解释器),php开发的程序可以不经修改运行在windows、linux、unix等多个操作系统上。

常驻内存

php-cli模式下可以实现程序常驻内存,各种变量和数据库连接都能长久保存在内存 [8]实现资源复用,比较常用的做法是结合swoole [7]组件编写cli框架。

页面生命周期

在php-fpm模式下,所有的变量都是页面级的,无论是全局变量还是类的静态成员,都会在页面执行完毕后被清空,对程序员水平要求低,占用内存非常少,特别适合中小型系统的开发。

运行机制

播报

编辑

PHP常见的运行模式有2种,分别是php-fpm [5]和php-cli [6]。当PHP 选择运行在php-fpm模式下,所有的变量都是页面级的,无论是全局变量还是类的静态成员,都会在页面执行完毕后被清空。运行在php-cli模式下可以实现程序常驻内存,各种变量和数据库连接都能长久保存在内存 [8]实现资源复用,性能可以得到很大的提升,php-cli虽然开发比较复杂,但是能够获取更高的性能,对开发者的要求比较高需要比较高的开发水平,比较常用的模式是结合swoole [7]组件编写cli框架,各种变量能保存在跨进程的高性能共享内存 Table [9],可以开发出支持热启动的php-cli可靠各类应用系统。

php-fpm在PHP 5.3.3 [24]版本成为了官方正式组件(2010-07-22),它提供了稳定可靠的进程管理服务,进程不足时候可以智能扩充数量,闲置时候可以自动回收销毁多余的进程,同时它对程序的容错能力很强大运行非常稳定,可以应付企业级的开发需求。php-fpm友好的完成了使用HTTP/HTTPS等TCP/IP互联网协议下进行的用户的输入输出,页面级生命周期各种资源用完即释放,不存在内存泄漏的问题。php-fpm也提供有一些常驻内存的技术支持,例如PHP 7.4引入的opcache.preload也能实现局部的PHP类和函数的常驻内存,不过这个方法不够灵活,和服务器配置捆绑的太死了。

php-cli因为能实现各类资源的常驻内存,所以可以资源复用,更高效完成多进程编程和异步编程,可以开发出负载能力更高的应用系统。但是相对php-fpm的简单编程开发,开发者要注意很多的事项和需要做很多附加的控制器开发,否则就无法实现期待中的高性能。

首先开发者需要去实现可靠的进程管理服务,保证系统进程遇到各类错误退出运行后能够自动创建新的进程,只有这样才能保证后续的服务请求有足够空闲进程可分配。每个业务代码段都要做异常处理,让进程遇到非致命错误时候不会退出,因为进程重启意味程序和各类资源需要再次加载,这个过程性能消耗不小,所以只有进程稳定运行了常驻内存才有意义。

其次因为常驻内存,编写的新的程序必须重启服务才能生效,这一点习惯了fpm模式的开发者会感到比较陌生。另外开发者需要手工释放内存,否则系统长时间运行后会出现内存泄露。同时在cli模式下,不能像fpm里直接用 $_SERVER、$_POST、$_GET、$_COOKI和$_FILES 进行编程工作,需要自己去解析各种互联网通讯协议完成用户的输入输出。要实现多进程编程利用多核CPU计算,还有学习使用pcntl和posix编程,这里涉及到了异步编程逻辑,这块难度还是比较大的。比较常用的模式是结合swoole [7]组件编写cli框架。

PHP是一个活跃的社区开发语言,有专业的核心开发团队在持续不断的迭代,最近一个版本就是PHP 8.0.8 [12]引入了很多的新特性。

参考框架

播报

编辑

(一)WordPress内容管理系统(CMS) [20]

功能强大、扩展性强,易于扩充功能;搭建的博客对seo搜索引擎友好,收录快排名靠前;网站上主题多,各色各样应有尽有;有强大的社区支持,有上千万的开发者贡献和审查。

(二)Hyperf [22]

Hyperf 是一个基于Swoole 高性能、高灵活性的渐进式 PHP 协程框架,内置协程服务器及大量常用的组件,性能较传统基于PHP-FPM 的框架有质的提升,提供超高性能的同时,也保持着极其灵活的可扩展性,标准组件均基于 PSR 标准实现,基于强大的依赖注入设计,保证了绝大部分组件或类都是 可替换 与 可复用 的。

(三)ThinkPHP

ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,最早诞生于2006年初,遵循Apache2开源协议发布。秉承简洁实用、出色的性能和至简的代码、注重易用性。并且拥有众多原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进。

(四)Drupal [23]

Drupal诞生于2000年 ,是一个基于PHP语言编写的开发型CMF(内容管理框架),即:CMS+ framework。Drupal的架构由三大部分组成:内核、模块、主题。三者通过Hook机制紧密的联系起来。可自由配置,能支持从个人博客到大型社区驱动的网站等各种不同应用的网站项目。

(五)easyswoole [27]

EasySwoole是一款常驻内存型的国产分布式swoole框架,支持同时混合监听HTTP、WebSocket、自定义TCP、UDP协议,且拥有丰富的组件,例如协程 连接池、协程Kafka客户端、协程ElasticSearch客户端、、协程Redis客户端、协程自定义队列、 协程Memcached客户端、协程HTTP客户端、Crontab定时器等。

(六)Laravel [28]

Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让从面条一样杂乱的代码中解脱出来;它可以构建一个不错的网络APP,而且每行代码都可以简洁、富于表达力。

(七)CakePHP [40]

CakePHP 设计层面很优雅,没有自带多余的 library,所有的功能都是纯粹的框架,执行效率还不错。

(八)imi [41]

它可以运行在 PHP-FPM、Swoole、Workerman 多种容器环境下

语言参考

播报

编辑

内置函数

PHP 有很多标准的函数和结构。还有一些函数需要和特定的扩展模块一起编译,否则在使用它们的时候就会得到一个致命的“未定义函数”错误。例如,要使用 image 函数中的 imagecreatetruecolor(),需要在编译 PHP 的时候加上 GD 的支持。或者要使用 mysqli_connect() 函数,就需要在编译 PHP 的时候加上 MySQLi 支持。有很多核心函数已包含在每个版本的 PHP 中如字符串和变量函数。调用 phpinfo() 或者 get_loaded_extensions() 可以得知 PHP 加载了那些扩展库。同时还应该注意,很多扩展库默认就是有效的。 [36]

在PHP编程里需要注意用户的输入安全,对用户各个方面的输入都要做好相关的过滤处理,内置函数里提供了不少的安全相关的函数,编程学习者需要重点掌握以下的7个重点函数如下表格:

用户输入安全的7个内置函数

函数名称

用途简介

htmlentities

将字符转换为 HTML 转义字符

htmlspecialchars_decode

将特殊的 HTML 实体转换回普通字符

htmlspecialchars

将特殊字符转换为 HTML 实体

nl2br

在字符串所有新行之前插入 HTML 换行标记

str_replace

子字符串替换

strip_tags

从字符串中去除 HTML 和 PHP 标记

stripslashes

反引用一个引用字符串

预定义变量

对于全部脚本而言,PHP 提供了大量的预定义变量。这些变量将所有的外部变量表示成内建环境变量,并且将错误信息表示成返回头。 [30]在PHP的编程里经常需要用到以下几个系统变量,编程学习者需要重点掌握的7个预定义变量如下表格:

重点需要掌握的7大预定义变量

变量名称

变量用途说明

$GLOBALS

引用全局作用域中可用的全部变量

$_SERVER

服务器和执行环境信息

$_GET

HTTP GET 变量(用户输入之一)

$_POST

HTTP POST 变量(用户输入之一)

$_FILES

HTTP 文件上传变量

$_SESSION

Session 变量(用户会话)

$_COOKIE

HTTP Cookies(用户会话标识)

数据类型

PHP 支持 10 种原始数据类型。四种标量类型:bool(布尔型)、int(整型)、float(浮点型,也称作 double)和string(字符串);四种复合类型:array(数组)、object(对象)、callable(可调用)和iterable(可迭代);最后是两种特殊类型:resource(资源)和NULL(无类型)。 [31]

运算符

运算符是可以通过给出的一或多个值(用编程行话来说,表达式)来产生另一个值(因而整个结构成为一个表达式)的东西。PHP的运算符包含:运算符优先级、算术运算符、赋值运算符、位运算符、比较运算符、错误控制运算符、执行运算符、递增/递减运算符、逻辑运算符、字符串运算符、数组运算符和类型运算符。 [32]

流程控制

任何PHP脚本都是由一系列语句构成的,一条语句可以是一个赋值语句、一个函数调用、一个循环、一个条件语句或者甚至是一个什么也不做的语句(空语句)。语句通常以分号结束,此外还可以用花括号将一组语句封装成一个语句组,语句组本身可以当作是一行语句。 [33]

类与对象

每个类的定义都以关键字class开头,后面跟着类名,后面跟着一对花括号,里面包含有类的属性与方法的定义。类名可以是任何非PHP保留字 的合法标签。一个合法类名以字母或下划线开头,后面跟着若干字母,数字或下划线。以正则表达式表示为:^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$。一个类可以包含有属于自己的常量,变量(称为“属性”)以及函数(称为“方法”)。要创建一个类的实例,必须使用 new 关键字。当创建新对象时该对象总是被赋值,除非该对象定义了 构造函数 并且在出错时抛出了一个 异常。类应在被实例化之前定义(某些情况下则必须这样)。如果在new之后跟着的是一个包含有类名的字符串 string,则该类的一个实例被创建。如果该类属于一个命名空间,则必须使用其完整名称。 [34]

命名空间

在 PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。PHP命名空间提供了一种将相关的类、函数和常量组合到一起的途径。 [35]

参考手册

php的文档内容比较多,这里这是摘录了部分内容,有需要的用户可以访问官网获取更完整的使用手册。 [37]

版本记录

播报

编辑

版本

发布日期

最终支持

相关更新及备注

1.0

1995-06-08

--

首次使用

2.0

1996-04-16

--

针对PHP 1.0的改进版,速度更快、体积更小,更容易产生动态网页。

3.0

1998-06-06

2000-10-20

Zeev Suraski和Andi Gutmans重写了底层,支持可扩展组件。

4.0

2000-05-22

2001-06-23

增加了Zend引擎,支持更多的 web 服务器、HTTP Sessions 支持、输出缓冲、更安全的用户输入和一些新的语言结构

4.1

2001-12-10

2002-03-12

加入了superglobal(超全局的概念,即$_GET、$_POST等)

4.2

2002-04-22

2002-09-06

默认禁用register_globals

4.3

2002-12-27

2005-03-31

引入了命令行界面CLI用来不用CGI

4.4

2005-07-11

2008-08-08

修复了一些致命错误

5.0

2004-07-13

2005-09-05

Zend升级为二代引擎,开始支持面向对象编程

5.1

2005-11-24

2006-08-24

引入了编译器来提高性能、增加了PDO作为访问数据库的接口

5.2

2006-11-02

2011-01-06

默认启用过滤器扩展

5.3

2009-06-30

2014-08-14

支持命名空间;使用XMLReader和XMLWriter增强XML支持;支持SOAP ,延迟静态绑定,跳转标签(有限的goto), 闭包,Native PHP archives。php-fpm在php5.3.3 [24]版本成为了官方正式组件

5.4

2012-03-01

2015-09-03

支持Trait、简短数组表达式。移除了register_globals, safe_mode, allow_call_time_pass_reference, session_register(), session_unregister(), magic_quotes以及session_is_registered()。加入了内建的Web服务器。增强了性能,减小内存使用量。

5.5

2013-06-20

2016-07-10

支持generators,用于异常处理的finally ,将OpCache(基于 Zend Optimizer+)加入官方发布中。

5.6

2014-08-28

2018-12-31

常数标量表达式、可变参数函数、参数拆包、新的求幂运算符、函数和常量的use语句的扩展、新的phpdbg调试器作为SAPI模块,以及其他更小的改进。使用php://input替代 $HTTP_RAW_POST_DATA,iconv和mbstring配置选项中和编码相关的选项废弃。

6.x

未发布

--

取消掉的、从未正式发布的PHP版本。

7.0

2015-12-03

2018-12-03

Zend引擎升级到三代 ,整体性能是5.6的2倍。移除ereg、mssql、mysql、sybase_ct等4个扩展。引入了类型声明,有两种模式: 强制 (默认) 和 严格模式。支持匿名类。

7.1

2016-12-01

2019-12-01

void返回值类型,类常量,可见性修饰符,新增可为空(Nullable)类型,新增短数组语法([])的,支持多异常捕获处理,废弃了mcrypt 扩展用OpenSSL取代

7.2

2017-11-30

2020-11-30

GD 扩展内的 png2wbmp() 和 jpeg2wbmp() 被废弃,对象参数和返回类型提示、抽象方法重写等

7.3

2018-12-06

2021-12-06

更灵活的 Heredoc 和 Nowdoc 语法,大小写不敏感的常量声明现被废弃,在字符串中搜索非字符串内容都将被视为字符串,而不是 ASCII 编码值。

7.4

2019-11-28

2022-11-28

Preloading预加载机制,改进OpenSSL、弱引用等。属性添加限定类型、有限返回类型协变与参数类型逆变、数值文字分隔符,为过渡到PHP8做了一定的准备。

8.0.0

2020-11-26

--

JIT (Just-In-Time即时编译)、新增static返回类型、新增mixed 类型、命名参数(Named arguments)和注释(Attributes) [39],不再允许通过静态调用的方式去调用非静态方法,字符串与数字的比较将首先将数字转为字符串再比较 [38]

8.2

2022-12

--

PHP 8.2 新增支持在 traits 中定义常量、引入了“Random”扩展和“read-only”类、Disjunctive Normal Form (DNF) 类型,更新了内置 web 服务器的 MIME 类型表,减少了各种函数返回的字符串的内存占用,初步支持 macOS Instrument 的 JIT 性能分析生成,为 Linux 启用 arc4random_buf,为随机字节引入 Glibc 2.36 以上版本。

PHP 8.2 初步支持 Windows for ARM64 平台上的跨平台创建,分配 JIT 缓冲区 Opcache 靠近 PHP .text 字段,以允许使用直接的 IP 相关调用和跳转。新版本还为 PHP Sockets 引入新选项,支持新的 Curl 选项,新的 ZipArchive 方法,废弃动态属性,并优化了一些性能。 [42]

8.3

2023-11

添加类常量显式类型、只读属性深拷贝,新增#[\Override] 属性,新增 json_validate () 函数,添加 Randomizer::getBytesFromString () 方法,添加 Randomizer::getFloat () 和 Randomizer::nextFloat () 方法 [43]

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天若有情673

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值