文章教程

1.1PHP技术的由来

9/17/2020 9:43:31 PM 人评论 次浏览

1.1 PHP技术的由来

1.1.1 服务器端脚本的发展轨迹——服务器端技术以前的技术

Web技术的发展总是曲线的,有时因为某种原因而得到修正提高,各种各样的技术兴盛而又衰退。复杂的技术进步轨迹也是Web发展的一个很有趣的地方。从这个意义上说,服务器技术不仅是Web系统的最佳解决方案,而是Web技术发展的一个重要方面。

本节将介绍PHP(PHP,Hypertext Preprocessor)所代替的服务器端技术在整个Web技术发展中所处的位置,以及PHP在服务器端技术中所处的分量。

HTML(HyperText Markup Language)

在急速的文档电子化的潮流中,曾出现过各种各样格式的电子文档。可是做成的电子文档,只是实现精美印刷这样的一个目的。很多被称为“标准”的格式,最终并没有成为标准,而且现在很多都消失了。

Web是作为基础技术以打破文档电子化时代混乱的面貌出现的,广泛应用的HTML技术是其中的标准技术之一。HTML(HyperText Markup Language)里有诸如<HTML>、<h1>的“对(tag)”。在“对”中间包含具体的文字,作为标示语言文档的构造,格式的定制都非常简单。尽管有许多像语义不够精确、实际安装时文件比较大等不足的地方,但是HTML作为Web系统的基础技术之一,功绩是不可磨灭的。后来,随着插件技术(Plugin)、CSS(Cascading Style Sheets)技术等的发展,HTML技术的表现力得到了飞跃的进步,但是最终HTML也只能提供生成静态文档的功能。因为那时,Web的主要目的只是文档的公布。

ActiveX/Java Applet

后来,CSS和HTML保持着长期共存的关系,插件技术并没有流行多久。确实曾经有一个时期,有很多各种各样的插件出现,给用户呈现了华丽而优美的网页效果。但是,因为需要强制用户在客户端安装插件程序,总是给人不够安全的感觉,不可能被大多数用户所接受。

这个时候,作为替代方案——ActiveX、Java小程序(Applet)出现了。ActiveX和插入的Java小程序直接嵌入在网页中,运行时自动安装所需要的控件,省略了插件导入的步骤。ActiveX和Java小程序给开发人员带来了最早在客户端需要编程的想法。

网页内容有了动态的变化,确实给用户带来了享受的感觉,但是这两样技术的流行时间可以说都比较短。一个重要的原因就是用户需要掌握比HTML更高级的语言,如Visual Basic、C++、Java等语言,而用户能实现的只是“界面”等表面化的东西。当然,当时的网络环境,如网络速度、网络普及程度也不够发达,应用ActiveX、Java小程序的网页都显示出得太慢,超过了用户的忍耐度,也是其没能流行起来的其中一个原因。

客户端、服务器端脚本

但是,ActiveX和Java小程序技术所带来的“客户端编程”的想法,在用户间流行起来了。显示的网页不再是静止不动,而是随着用户的输入、鼠标单击,网页显示的内容就会动态变化。所谓“交互式网站”的Web开发一时间流行起来了,这个时期正是全球规模的信息共享的目标达成之时,开发者的意识也从“如何实现信息共享”发展到了“如何做到与纸媒体的差别化”上来了。

能实现这些的就是客户端脚本了。以Javascript、VBScript为代表的客户端脚本语言是能在浏览器上运行的“简易”语言。它们本来就是为浏览器定制的,所以与ActiveX及Java小程序比较起来,运行时显得“轻”得多。基于这个理由,这两种脚本已被用户广泛接受了。后来又将Dynamic HTML及DOM(Document Object Model)的概念引进来,这样脚本语言的应用范围大大地扩展,功能也强化了。

但是,这些用脚本语言开发出来的程序网页尽管看起来是动态的,其实数据资源是静态的。因此,客户端、服务器端脚本是Web上“文字公开”的解决方案,并不是Web的基本构架。

1.1.2 服务器端脚本的发展轨迹——CGI的时代

Web是在独特的文化中成长起来的,项目的前提有时也会变成了最终目的。正如1.1节里介绍的那样,Web本来的目的就是为了“文档公开共享”,但是从计算机技术的观点来看,要达成这个目的,需要解决浩如烟海的信息的输入/输出,也伴随着输入/输出的数据流程的问题。Web只有输出的部分,在某种意义上显得极端不自然。

客户端脚本的极限

客户端脚本在Web的数据处理中,有各种各样的极限,下面将客户端脚本内包含的问题一一列举出来。

● 不能信息加工

客户端脚本只是实现了表面的动态化(Dynamic),所谓Dynamic HTML,只是从表面上表述了客户端脚本的特性。而本质上,客户端脚本并不能改变网页上的内容,从这个意义上讲还没有逃脱“文档公开”这个范围。

● 逻辑的复杂性与网页大小的比例

客户端脚本,顾名思义,它只能在客户端(浏览器)上运行,必须先将所有数据都下载到客户端才能执行。如果网页有10 000条数据,那么首先就要将这10 000条数据下载到客户端,而网页实际上用到的可能只是其中很少的几条,其余都是不需要的,这样一来就影响了网页的显示速度。这种抽取需要或不需要数据的功能,是客户端脚本所不具备的。

● 客户端环境依存

这里提醒大家的一点是,说到客户端,并不是只指桌面个人电脑的客户端,手机以及其他手持电子设备也包括在内,形态是多种多样的。

对于依存客户端环境的客户端脚本来说,随着终端设备的不同,对应不同的编程。从发展到现在的情况来看,开发者将所有终端设备的情况都考虑进去进行编程设计是不可能的。造成的结果就是在客户端只能安装各终端设备共通的功能,这样客户端脚本的适用范围就大大变小了。

● 程序的安全性

如“密码”这种机密性很高的信息在网页中处理的情况是很常见的。使用客户端脚本时,必须全在客户端公开。一些必须隐藏的信息,也必须全公开。最近出现的encode/uncode技术,在一定程度上解决了这些问题。

CGI(Common Gateway Interface)

以上客户端脚本所面对的问题,其实是数据处理都是在客户端进行这个原因造成的,只要数据不在客户端处理时,这些问题就迎刃而解。那么,客户端以外的处理环境就是服务器了。

服务器上存储了文档、程序,以及其他相关数据。那些对用户来说没有用处的程序、不需要的数据其实不用通过网络传送了,需要隐藏的数据就不会通过网络泄露。服务器将完成所有的处理,只是将处理的结果以HTML的形式传送到客户端的浏览器。

这些服务器端的处理模式,其实并不陌生。Perl(Practical Extraction and Reporting Language)和以C为代表的CGI(Common Gateway Interface),就是以这些现在大家都很熟悉的模式运行的(如图1-1所示)。

alt

图1-1 服务器端脚本的运作机制

在内容为主体的网页中,以开发网页的计数器、访问列表这样的小功能为目的,CGI具体对于以数据处理为中心的服务器端技术来说,缺点是显而易见的。CGI在开发难度、保守性、性能表现来讲,都有不足之处。

● 耗费服务资源太多

CGI是从服务器上调用的外部程序的总称,也就是说,用户每发出一次请求(Request)就需要建立一个新的执行进程,用户送出多少次的请求就要生成多少次通信进程。对小的CGI程序来说,对服务器资源的占用不会有什么问题,但对那些复杂的商业应用程序来讲,有限的服务器资源就有被耗尽的危险,这就是所谓的“资源瓶颈”问题。

对于用户数变动很大的Web系统来讲,资源变动的脆弱性这个缺点可以说是致命的。

● 开发时要注意底层的协议

Perl和C语言并不是专门为Web程序而开发的,CGI开发者在开发中,必须要注意照顾到Web特有的协议(如UTP,HTTP等)。这些不仅仅意味着掌握CGI编程需要一定的技术水平,同时也意味着CGI存在开发瓶颈。

Perl开发的程序里没有“Session”的概念,A网页上的信息经过B网页,准备在C网页上显示时,CGI开发者必须自行设计框架来解决这个问题。

其他的,连现在Web开发中经常使用的“Cookie”,在CGI中也必须将HTTP考虑进来专门编写代码。还有,当开发者想将一系列的程序当成一个项目来组织时,CGI就很难办到了。

● 网页设计与编程开发

Perl也好,C也罢,实际上是通用开发语言,只是将处理结果按照HTTP的规则显示出来而已。所以如果就连一个HTML的“对”都得用print语言将其输出出来的话,则这就意味着,对于开发周期短的Web开发来说,所有作业都得在其中编程。而逻辑由程序员负责,内容由编辑负责,设计由设计人员来分担的这种合作开发模式,在CGI开发中就很难办到了。

1.1.3 服务器端脚本轨迹——服务器端脚本

正因为CGI有以上所介绍的这些缺点,慢慢地就不怎么受开发者的青睐了。这时候就出现了被称为CGI后继的技术。PHP就是这些技术之一。下面就PHP是一种什么样的技术,有些什么样的特性做些简单的介绍。

● 脚本语言

PHP是一门初级程序员都可以用来写出有用有效程序的语言,有着逐行顺次进行解释的、很容易重复and-error式的循环,能保证很高的生产效率等优势。性能表现尽管不能和那些能编译的语言相比,但是从PHP4开始,搭载上高性能的脚本处理引擎Zend Engine后,也能实现高速的处理,实际运行时几乎不产生瓶颈问题。在最新的PHP5中,Zend Engine升级到2.0后,处理的效率更高了。

● HTML嵌入式语言

PHP必须嵌入在HTML中才能运行。与HTML有天然的亲和性,只要处理则能写出很优秀的程序。结果直接在HTML中输出就可以了,不需要输出部分的编程,实际的逻辑部分非常短小精悍。

● 容易掌握的高级语言

与Perl、Javascript这些C语言系列的语言很相似,PHP也拥有自己的语言格式。掌握了上述语言的开发人员很容易上手,即使是第一次接触脚本语言的程序员,基本上都能在短时间内掌握它。

现在,PHP中面向对象的思想也得到了强化,对于重复使用性、维护性好的大规模网站也能很容易地搭建了。

● 丰富的程序库

毫不夸张地说,只要是想实现的功能,都能找得到相应的PHP程序库。PHP开发时,将单个功能的程序块进行组合,就能实现复杂的商业逻辑,不用从零开始写那些原始的逻辑了。也正因为这样,初级程序员就能很容易地读懂PHP程序。

● 容易与各种类型的数据库连接

像MySQL、PostgreSQL等免费的数据库,还有Oracle、Sybase、Informix、SQL Server等商用的数据库,以及ODBC等通用的数据库接口等主要的数据库产品接口都内置在PHP程序包中,且可以自由安装或卸载。

最新的PHP5中轻量数据库引擎SQLite也已被内置。只要安装了PHP,就能构筑数据库连接的应用程序了。当然,数据库连接和服务器端技术并非等价,但肯定是个极其重要的优势。PHP和数据库的无缝结合能提供更简便、高级的解决方案。

1.1.4 各种服务器技术的比较

上述介绍的PHP构架并不是新鲜的技术。这之前介绍的以Perl、C等为代表的古典的CGI,以及Windows平台的ASP.NET,还有以跨多平台的处理环境为特征的,由Java语言构筑的JSP/Servlet等,都有很广泛的支持。

就服务器端脚本技术来讲,各自的技术特征总是千差万别的。本节选择其中几种典型脚本语言与PHP进行比较,让大家从横向上更好地了解一下PHP。

CGI与PHP

正如以前所介绍的,CGI是古典的服务器端技术,在开发的生产性、可维护性、易学性上不怎么让人满意。

然而,PHP本来就是为制作Web网站而定制的语言,功能也是为Web定制的。那些经常使用的功能都作为函数提前准备好了,入门者可以很容易学会。在PHP中出错信息的生成功能也是很充分的,在程序调试时可以充分感受到。

因为PHP已经和Web服务器组装在了一起,因此不用每次生成请求时都生成新的进程了。虽然在Web服务器里组装进了PHP脚本翻译器而运行时显得“重”,但随着现在Web服务器中引进了动态模块的概念后,可根据需要动态载入,这在一定程度上解决了这个问题。

ASP.NET与PHP

ASP.NET是在Windows环境下运行的服务器端脚本,在HTML中嵌入被称为服务器控件(Server Control)的“标签”(tag),拥有在服务器端技术中被称为事件驱动模型的独特构架。

在ASP 3.0中抛弃了以前的VBScript、JScript等解释型语言,采用了Visual Basic、C#等编译型语言后,成功地提升了性能,并提供了各种语言都能使用的类库。灵活的数据库应用、强大的文件处理、字符串处理、简便的自定义函数等,都是其用户迅速增加的原因。

但是,就其运行环境限制在Windows+IIS(Internet Information Services)平台的这一点来讲,在普及上还是有很大的局限性的。最近由Mono工程组(http://www.mono-project.com)开发的能在Linux等UNIX系列操作系统运行的,公开源码的.NET环境的出现,给普及带来了一丝希望。从实际使用情况来看,在UNIX环境下广泛使用.NET还有很长的路要走。

然而,PHP原则上在UNIX/Windows/Mac等操作系统上都能运行,从Web服务器产品来说,有Web服务器最大市场占有率第一的Apache,还支持IIS、Sun Java System Web服务器等重要的服务器产品,平台的通用性正是PHP的魅力之处。

JSP/Servlet与PHP

JSP(Java Server Pages)/Servlet是具有代表性的Web开发语言Java的服务器端版本。

大家知道Java语言追求“Write Once,Run Anywhere”的开发概念,这在多样化的服务器环境中是非常重要的因素。JSP/Servlet不用选择环境,其代码在不同的环境中能保证很好的移植性。Servlet负责应用程序的逻辑部分,而JSP用于网页显示,彼此分工明确。逻辑部分能够被再利用,从而能保证很高的生产效率,以及可维护性。

但是,Java语言再怎么好用,与脚本语言比较起来,对一般的开发人员来说,还是显得门槛有点高。尽管最近标榜着EoD(Ease of Development容易开发),以及比如JSF(Java Server Faces)、Groovy等新技术也纷纷登场,与追求直观易懂的PHP比较起来,还是需要花更多的时间去学习的。

JSP的分工开发的优势,对那些中小规模的网站来说,优势显得并不明显,然而,PHP在构筑中小规模的网站时拥有更大的灵活性。最新的PHP5.0中强化了面向对象的概念后,构筑大规模的网站时,开发再利用性好,可维护性强的代码成为可能。

表1-1总结了各种服务器技术与PHP的比较。

表1-1 各种服务器技术与PHP的比较

alt

教程类别