编程语言之PHP
2014-09-08 21:39:15 阿炯

PHP(全称:PHP:Hypertext Preprocessor,即“PHP:超文本预处理器”)是一种开源的通用计算机脚本语言,尤其适用于网络开发并可嵌入HTML中使用。PHP的语法借鉴吸收了C语言、Java和Perl等流行计算机语言的特点,易于一般程序员学习。PHP的主要目标是允许网络开发人员快速编写动态页面,但PHP也被用于其他很多领域。


PHP原本的简称为Personal Home Page,是拉斯姆斯·勒多夫为了要维护个人网页,而用c语言开发的一些CGI工具程序集,来取代原先使用的Perl程序。最初这些工具程序用来显示拉斯姆斯·勒多夫的个人履历,以及统计网页流量。他将这些程序和一些窗体解释器集成起来,称为PHP/FI。PHP/FI可以和数据库连接,产生简单的动态网页程序。拉斯姆斯·勒多夫在1995年6月8日将PHP/FI公开发布,希望可以通过社区来加速程序开发与查找错误。这个发布的版本命名为PHP 2,已经有今日PHP的一些雏型,像是类似Perl的变量命名方式、窗体处理功能、以及嵌入到HTML中运行的能力。程序语法上也类似Perl,有较多的限制,不过更简单、更有弹性。

PHP最初是由勒多夫在1995年开始开发的。而现在PHP的标准由PHP Group和开放源代码社区维护。PHP以PHP License作为许可协议,不过因为这个协议限制了PHP名称的使用,所以和开放源代码许可协议GPL不兼容。


PHP的应用范围相当广泛,尤其是在网页程序的开发上。一般来说PHP大多运行在网页服务器上,通过运行PHP代码来产生使用者浏览的网页。PHP可以在多数的服务器和操作系统上运行,而且使用PHP完全是免费的。


类型
PHP主要有以下四种标量类型:
整数型(integer)
浮点数型(float)
布尔型(boolean)
字符串(string)

两种复合类型:
数组(array)
对象(object)

两种特殊类型
NULL
资源(resource)
整数(计算机科学)整数型(integer)

框架
PHP官方的框架为Zend framework,2005年开始开发至今已经步入成熟期,尽管对于PHP框架的方向业界还有争议,但在实际生产中框架的使用已非常普遍。使用PHP框架可以更快更简单的部署项目并提高开发效率,但学习使用这些框架需要付出额外的学习成本。


内置多样化的函数是PHP主要的特点之一,这些开放代码的函数提供了各种不同的功能,例如文件处理、FTP、字符串处理、等等。这些函数的使用方法和C语言相近(例如printf),这也是PHP广为流行的原因之一。

除了内置的函数之外,PHP也提供了很多扩展库(extension),像是各种数据库连接函数、数据压缩函数、图形处理等等。有些延伸库需要从PECL(PHP Extension Community Library)取得。

模板引擎
模板引擎让PHP应用程序可以做逻辑和使用界面上的分离,让程序开发更容易进行,目前比较受欢迎的模板引擎是PHP官方开发的Smarty。不过模板引擎存在性能方面的争议,因为PHP本身就是一个模板引擎,使用模板引擎反而变成“重新发明了轮子”(reinventing the wheel)。模板引擎最主要的好处就是让不懂PHP代码的人也可以参与使用界面的开发,因为模板引擎的语言远比PHP简单。例如非常经典的MVC结构(模型-视图-控制)即是对模板引擎的最好应用,让PHP编程人员可以和HTML前端程序员分工合作。


PHP 协程提案 Fiber 引发激辩

PHP 社区于2021年3月8日发起了将 Fiber RFC 添加到 PHP 的投票。根据 Fiber RFC 中的描述,Fiber 主要用于为异步 I/O 实现协程,提供了独立栈分配、函数调用的暂停和恢复功能,它将作为扩展集成到 PHP 中。按照计划,投票将于3月22日截止,最新数据为 38 票赞同、11 票反对。从目前的结果来看,Fiber RFC 很大可能会通过投票从而被添加到 PHP(获得 2/3 的赞成票即可通过)。当前公开的投票结果显示,两位创始人——PHP 创始人 Rasmus Lerdorf 和 Swoole 创始人韩天峰均投了反对票。

Swoole 是一个 PHP 协程框架,为 PHP 提供协程、高性能网络编程支持,并提供了多种通信协议的网络服务器和客户端模块,可以方便快速地实现 TCP/UDP 服务、高性能 Web、WebSocket 服务、物联网、实时通讯、游戏、微服务等,使 PHP 不再局限于传统的 Web 领域(来自 Swoole 官网介绍)。

Reddit 上的一篇帖子引起了不少讨论,有人认为 Fiber 是 generator 的升级版本,它是协程的最小化核心实现,并且不会对 PHP 产生不利影响,将它集成到 PHP 有利于发展和探索未来的异步生态。也有人质疑其投反对票是因为担心此提案会对 Swoole 的商业化 (Swoole Plus) 造成影响。对于 Fiber RFC 的观点是,建议先作为一个 PECL 扩展,PHP 内核开发者能够思考清楚 PHP 未来协程的整体技术体系和实现方式后再做决定。实际上异步编程颠覆了 PHP 一直以来的设计哲学和编程模式。如果 PHP 语言官方决定要支持像 Node.js、Golang、Swoole 这样的异步/协程并发编程模式,那么就需要系统性思考一下整体的架构,以及完整的实现。

韩继续发表文章(关于 PHP 8.1 的 Fiber RFC)从技术细节详细地解释了自己反对 Fiber RFC 的原因。他认为用户真正需要的是一种完整的、系统性、成体系、简单易用、可靠的一整套技术方案,并根据自己的经验提出可从 7 个方面进行考虑:
EventLoop API
协程(对应 ext-fiber)
IO 调度器(Socket/FileSystem/ChildProcess/Signal/Timer/Stdout/Stdin)
CPU 调度器
现有同步阻塞 IO 扩展(redis、curl、php_stream、sockets、mysqli、pdo_mysql 等)和内置函数(sleep、shell_exec、sleep、gethostbyname 等)如何实现支持协程,变成异步非阻塞模式
协程通信(channel)
服务器:实现 PHP-FPM 协程版,或者提供一个新的协程 HttpServer

虽然他给出了充分的理由投反对票,但从目前看来,许多人并不认可他的做法。他们认为,即便实现 PHP 的协程化难度很大也不需要等到有成熟方案之后才合并,也不能因为 Fiber 不够完善,就猜测它不能满足大多数人的要求。反而因为 Fiber 是最小化实现,集成到 PHP 不会对使用者造成很大的维护负担,却又能满足很多人的项目需求,他们可以在此基础上进行更多实现,为用户开放了探索各种协程方案的可能。因此,这一部分开发者认为没有理由反对将 Fiber RFC 添加到 PHP。双方思考角度不同,所以给出了截然相反的投票结果,而且他们都有各自的立场——虽然初衷都是希望 PHP 变得更好,但无论如何,最后还是以投票结果为准。


关于轻量级高性能的 API 和 MVC 应用服务框架-Swoolefy

Swoolefy是一个基于swoole扩展实现的轻量级高性能的常驻内存型的API和Web应用服务框架,高度封装了http,websocket,udp服务器,以及基于tcp实现可扩展的rpc服务,同时支持composer包方式安装部署项目。swoolefy抽象Event事件处理类,实现与底层的回调的解耦,支持同步|异步调用,内置view、Log、session、mysql、redis、memcached、mongodb等常用组件等。

核心特性
1、轻量级的框架,实现路由与调度,MVC三层,当然也可以配置多层
2、支持composer的PSR-4规范和实现自定义注册命名空间
3、支持多协议,目前支持http,websocket,tcp,udp,以及基于tcp实现的rpc,开放式的系统接口,可自定义协议数据格式
4、抽象Event的事件处理与底层的事件监听解耦,屏蔽不同协议之间的应用差异,大部分代码实现共用
5、实现超全局变量,IOC,静态延迟绑定,组件服务常驻内存化,trait的多路复用,钩子事件,单例,工厂模式等
6、简单易用的异步务管理TaskManager, 定时器管理TickManager, 内存表管理TableManager, 进程管理ProcessManager,超全局管理
7、灵活多层的配置,配置参数即可实现底层已封装的复杂功能
8、应用对象的深度复制,实现对象的常驻内存,每个请求只需要从内存中复制应用对象,不需要再重新创建,减少IO消耗
9、封装View,Log,Mysql,Redis,Mongodb,Swiftmail,Session等常用组件,其他组件根据业务按照约定即可封装成组件
10、实现异步半阻塞与全异步非阻塞,EventHander与底层解耦
11、基于inotify实现自动监控swoole服务的文件变动,实现worker自动reload,智能邮件通知
12、命令行形式高度封装启动|停止控制的脚本,简单命令即可管理整个框架



最新版本:7.0
还有其他一些比较小的改进,比如显著减少内存使用,添加返回类型声明等等功能。PHP 7包含了一些重大安全改进,如除去PHP安全模式,添加魔术引号,有一些新的保留关键字等等。PHP 7.0 包含最新版本的 Zend Engine,包括以下特性:
提升性能:PHP 7 速度是 PHP 5.6 的两倍
显著降低内存使用
抽象语法树
支持 64 位
许多重大错误可以进行异常处理
移除了旧的和不支持的 SAPIs 和扩展
安全的随机数生成器
null 合并操作符
结合比较运算符 (<=>)
标量类型声明
匿名类
GMP 对象支持操作符重载
允许上传超过 2G 的文件

官方主页:http://php.net/
该文章最后由 阿炯 于 2021-08-11 14:18:27 更新,目前是第 2 版。