PHP(PHP: Hypertext Preprocessor)即“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于 Web 开发并可嵌入 HTML 中。PHP 语法学习了 C 语言,吸纳 Java 和 Perl 多个语言的特色发展出自己的特色语法,并根据它们的长项持续改进提升自己,例如 Java 的面向对象编程,该语言当初创建的主要目标是让开发人员快速编写出优质的 web 网站。PHP 同时支持面向对象和面向过程的开发,使用上非常灵活。
PHP 是一个拥有众多开发者的开源软件项目,最开始是 Personal Home Page 的缩写,已经正式更名为 “PHP: Hypertext Preprocessor”。PHP是在 1994 1994 1994 年由 Rasmus Lerdorf 创建的,最初只是一个简单的用 Perl 语言编写的统计他自己网站访问者数量的程序。后来重新用 C 语言编写,同时可以访问数据库, 1995 1995 1995 年,PHP(Personal Home Page Tools)对外发表第一个版本 PHP1。此后,越来越多的网站开始使用 PHP,并且强烈要求增加一些特性,如循环语句和数组变量等, 1995 1995 1995 年发布的 PHP2 加入了对 mySQL 的支持。
Andi Gutmans 和 Zeev Suraski 在为一所大学的项目中开发电子商务程序时发现 PHP2 功能明显不足,于是他们重写了代码发布了 PHP3。PHP3 是类似于现代 PHP 语法结构的第一个版本,PHP3 的最强大的功能是它的可扩展性,PHP3 的新功能和广泛的第三方数据库、API 的支持使得这样程序的编写成为可能。
PHP3 官方发布不久,Andi Gutmans 和 Zeev Suraski 开始重新编写PHP代码。设计目标是增强复杂程序运行时的性能和PHP自身代码的模块性。经过不懈努力Zend引擎研发成功并且实现了设计目标,并在 1999 1999 1999 年中期引入 PHP。基于该引擎并结合了更多新功能的 PHP4 于 2000 2000 2000 年 5 5 5 月正式发布。除了更高的性能以外,PHP4还包含一些关键功能,比如:支持更多的 web 服务器、HTTP Sessions 支持、输出缓冲、更安全的用户输入和一些新的语言结构。
PHP5 于 2004 2004 2004 年 7 7 7 月正式发布,它的核心是 Zend 引擎 2 2 2 代(PHP7 是 Zend 加强版 3 代),引入了新的对象模型和大量新功能,开始支持面向对象编程。随着 PHP6 经历长时间的开发流产后,PHP5 发布了 6 6 6 个版本顽强的支撑着开源社区的发展,直到 2015-12-03 那天迎来了 PHP 7.0 的发布,其实 PHP5.6 已经包含了很多 PHP6 想实现的特性,它为 PHP7 的研发争取了宝贵的时间。不负众望 PHP7.0 对比 PHP5.6 性能整整提升了 2 2 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 对比 PHP5.6 性能提升了 2 2 2 倍,另外 PHP7.4 提供的 Preloading 预加载机制实现了部分程序常驻内存,获取了不错的性能提升,在 PHP8 又提供了高效的 JIT(Just-In-Time即时编译)运算支持。另外水平更高的开发者可以转向难度更高的 php-cli 编程,它能解决大部分的系统性能问题,无论是 PHP7 和 PHP8 都支持这种模式的编程。
经过二十多年的发展,随着 php-cli 相关组件的快速发展和完善,PHP 已经可以应用在 TCP/UDP 服务、高性能 Web、WebSocket 服务、物联网、实时通讯、游戏、微服务等非 Web 领域的系统研发。
根据 W3Techs2019 年 12 月 6 号发布的统计数据,PHP 在 WEB 网站服务器端使用的编程语言所占份额高达 78.9 % 78.9\% 78.9%。在内容管理系统的网站中,有 58.7 % 58.7\% 58.7% 的网站使用 WordPress(PHP 开发的 CMS 系统),这占所有网站的 25.0 % 25.0\% 25.0%。
PHP 是一个受众大并且拥有众多开发者的开源软件项目,Linux + Nginx + Mysql + PHP 是它的经典安装部署方式,相关的软件全部都是开源免费的,所以使用 PHP 可以节约大量的正版授权费用。不过 PHP 作为一个开源软件,它缺乏大型科技公司的支持背景,网络上对它的唱衰也是经久不衰,不过它的持续迭代和性能持续增强的现实却是鼓舞人心的,PHP 社区用实际行动给予各种质疑强有力的回击。
PHP 的内核是 C 语言编写的基础好效率高,可以用C语言开发高性能的扩展组件;PHP 的核心包含了数量超过 1000 1000 1000 的内置函数,功能应有尽有很全面,开箱即用程序代码简洁;PHP 数组支持动态扩容,支持以数字、字符串或者混合键名的关联数组,能大幅提高开发效率;PHP 是一门弱类型语言,程序编译通过率高,相对其他强类型语言开发效率快;PHP 天然热部署,在php-fpm运行模式下代码文件覆盖即完成热部署;PHP 经过 20 20 20 多年的发展,在互联网上可以搜到海量的参考资料供参考学习。
PHP 版本越高它的整体性能越高,根据官方介绍,PHP7.0.0 对比 PHP5.6 性能就提升了 2 2 2 倍,PHP7.4 已经比 PHP7.0 快了约 30 % 30\% 30%,PHP8.0 在性能上又相对 PHP7.4 大约改进了 10 % 10\% 10%。PHP 8.0 引入了 JIT 编译器特性,同时加入多种新的语言功能,例如命名参数、联合类型、注解、Constructor Property Promotion、match 表达式、nullsafe 运算符以及对类型系统、错误处理和一致性的改进。PHP拥有自己的核心开发团队,保持 5 5 5 年发布一个大版本、 1 1 1 个月发布 2 2 2 个小版本的频率,最新的版本是PHP8.08。PHP 7.0.0 发布于 2015-12-03,此版本下最新版本是 PHP 7.4.21(发布日期:2021-07-01),PHP 8.0.0 发布于 2020-11-26,此版本下最新版本是 PHP 8.0.8(发布日期:2021-07-01)。
每个平台都有对应的 php 解释器版本,指针对不同平台均编译出目标平台的二进制码(PHP解释器),php 开发的程序可以不经修改运行在 windows、linux、unix 等多个操作系统上。
php-cli 模式下可以实现程序常驻内存,各种变量和数据库连接都能长久保存在内存实现资源复用,比较常用的做法是结合 swoole
组件编写 cli
框架。
在 php-fpm 模式下,所有的变量都是页面级的,无论是全局变量还是类的静态成员,都会在页面执行完毕后被清空,对程序员水平要求低,占用内存非常少,特别适合中小型系统的开发。
PHP 常见的运行模式有 2 2 2 种,分别是 php-fpm 和 php-cli。当 PHP 选择运行在 php-fpm 模式下,所有的变量都是页面级的,无论是全局变量还是类的静态成员,都会在页面执行完毕后被清空。运行在 php-cli 模式下可以实现程序常驻内存,各种变量和数据库连接都能长久保存在内存实现资源复用,性能可以得到很大的提升,php-cli 虽然开发比较复杂,但是能够获取更高的性能,对开发者的要求比较高需要比较高的开发水平,比较常用的模式是结合 swoole
组件编写 cli 框架,各种变量能保存在跨进程的高性能共享内存 Table,可以开发出支持热启动的 php-cli 可靠各类应用系统。
php-fpm 在 PHP 5.3.3 版本成为了官方正式组件,它提供了稳定可靠的进程管理服务,进程不足时候可以智能扩充数量,闲置时候可以自动回收销毁多余的进程,同时它对程序的容错能力很强大运行非常稳定,可以应付企业级的开发需求。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
组件编写 cli 框架。
PHP 是一个活跃的社区开发语言,有专业的核心开发团队在持续不断的迭代,最近一个版本就是 PHP 8.0.8 引入了很多的新特性。
PHP 独特的语法混合了 C、Java、Perl 以及 PHP 自创新的语法。
PHP 可以比 CGI 或者 Perl 更快速的执行动态网页——动态页面方面,与其他的编程语言相比,
PHP 是将程序嵌入到 HTML 文档中去执行,执行效率比完全生成 htmL 标记的 CGI 要高许多;
PHP具有非常强大的功能,所有的 CGI 的功能 PHP 都能实现。
PHP支持几乎所有流行的数据库以及操作系统。
最重要的是 PHP 可以用 C、C++ 进行程序的扩展!
$input = trim(file_get_contents("php://stdin"));
list($a, $b) = explode(' ', $input);
echo $a + $b;
echo "Hello World!\n" ;
?>
<html>
<head>
<meta charset="utf-8">
<title> </title>
</head>
<body>
<?php
if (isset($_COOKIE["user"]))
echo "欢迎 " . $_COOKIE["user"] . "!
";
else
echo "普通访客!
";
?>
</body>
</html>