比较PHP和JSP这两个web开发技术,在目前的情况是其实是比较PHP和Java的Web开发。以下是我就几个主要方面进行的比较:
一、 语言比较
Php是解释执行的服务器脚本语言,首先php有简单容易上手的特点。语法和c语言比较象,所以学过c语言的程序员可以很快的熟悉php的开发。而java需要先学好java的语法和熟悉一些核心的类库,懂得面向对象的程序设计方法。所以java不如php好学。
Java首先要编译成字节码.class文件,然后在java虚拟机上解释执行。Java的web开发首先最容易想到的就是JSP(现在已经到JSP2.0),原来的java的web开发都是用servlet来实现的,用servlet来开发需要程序员在java的源文件中嵌入大量的html代码。所以后来就出现了JSP,JSP可以方便的嵌入到html文件当中,其实jsp文件在服务器上执行的时候首先会被应用服务器转换成servlet,然后再编译执行。Jsp可以通过servlet和JavaBean的支持产生强大的功能。JavaBean 是一种可复用的、跨平台的软件组件。使用javabean可以方便的实现java代码和html的分离,能够增强系统的功能和软件的复用性。
Java的web开发属于SUN公司定义的J2EE其中的规范。而且在J2EE中包括了java的web开发的所有方面,如:JSP、Servlet、JDBC、JNDI、JAVABEAN、EJB等等。J2EE就特别适合于做大型的企业级的应用。
二、 数据库访问比较
Java通过JDBC来访问数据库,通过不同的数据库厂商提供的数据库驱动方便地访问数据库。访问数据库的接口比较统一。
PHP对于不同的数据库采用不同的数据库访问接口,所以数据库访问代码的通用性不强。例如:用Java开发的web应用从MySQL数据库转到Oracle数据库只需要做很少的修改。而PHP则需要做大量的修改工作。
三、 系统设计架构比较
采用Java的web开发技术,需要使用的是面向对象的系统设计方法,而PHP还是采用面向过程的开发方法。所以用Java进行开发前期需要做大量的系统分析和设计的工作。
四、 跨平台性
Java和PHP都有很好的跨平台的特性。几乎都可以在不作任何修改的情况下运行在Linux或者Windows等不同的操作系统上。
五、 开发成本比较
PHP最经典的组合就是:PHP + MySQL + Apache。非常适合开发中小型的web应用,开发的速度比较快。而且所有的软件都是开源免费的,可以减少投入。
Java的web应用服务器有免费Tomcat、JBoss等,如果需要更好的商业化的服务有:Web Sphere和 Web logic。
六、 分布式多层架构比较
PHP只能实现简单的分布式两层或三层的架构,而JAVA在这方面就比较强大,可以实现多层的网络架构。数据库层(持久化层)、应用(业务)逻辑层、表示逻辑层彼此分开,而且现在不同的层都已经有一些成熟的开发框架的支持。例如Struts就是利用java的web开发技术实现了MVC的设计模式,而在业务逻辑层也有Spring框架,数据库持久化层有Hibernate等框架。这些框架可以方便开发者高效、合理、科学得架构多层的商业应用。
下面简要的说一下Struts,它实质上是在JSP Model2的基础上实现的一个MVC(Model、View、Controler)框架。JSP Model2体系结构是一种联合使用JSP 与Servlet 来提供动态内容的方法。在Struts框架中,模型由实现业务逻辑的JavaBean或EJB组件构成,控制器由Servlet实现的,视图由一组JSP文件组成。采用Struts可以明确角色的定义和开发者与网页设计者的分工。而且项目越复杂,其优势越明显。
七、 源代码安全
PHP开发的程序的源代码都是公开的,他人拿到php开发的程序后都可以进行修改。
Java开发的程序,最后用户拿到的是只是一些编译好的class类,无法看到完整的源代码,安全性高。
八、性能比较
有人做过试验,对这两种种语言分别做回圈性能测试及存取Oracle数据库测试。
在循环性能测试中,JSP只用了令人吃惊的四秒钟就结束了20000*20000的回圈。而PHP测试的是2000*2000循环(少一个数量级),却分别用了63秒。
数据库测试中,二者分别对 Oracle 8 进行 1000 次 Insert,Update,Select和Delete: JSP 需要 13 秒,PHP 需要 69 秒。
表格 1 PHP 与Java的比较
PHP JAVA
可复用性 低 高
开发速度 快 慢
易维护性 差 优
可移植性 优-Linux、Windows、Unix等
安全性 低 高
开发费用 低 高
多层架构 差 优
数据库访问 接口不统一 接口统一
可扩展性 差 优
面向对象 差 优
综上所述,我个人认为,PHP适合于快速开发,中小型应用系统,开发成本低,能够对变动的需求作出快速的反应。而Java适合于开发大型的应用系统,应用的前景比较广阔,系统易维护、可复用性较好。还有,同样功能的系统用Java开发的系统要比PHP开发的系统的价格要高。
一、 语言比较
Php是解释执行的服务器脚本语言,首先php有简单容易上手的特点。语法和c语言比较象,所以学过c语言的程序员可以很快的熟悉php的开发。而java需要先学好java的语法和熟悉一些核心的类库,懂得面向对象的程序设计方法。所以java不如php好学。
Java首先要编译成字节码.class文件,然后在java虚拟机上解释执行。Java的web开发首先最容易想到的就是JSP(现在已经到JSP2.0),原来的java的web开发都是用servlet来实现的,用servlet来开发需要程序员在java的源文件中嵌入大量的html代码。所以后来就出现了JSP,JSP可以方便的嵌入到html文件当中,其实jsp文件在服务器上执行的时候首先会被应用服务器转换成servlet,然后再编译执行。Jsp可以通过servlet和JavaBean的支持产生强大的功能。JavaBean 是一种可复用的、跨平台的软件组件。使用javabean可以方便的实现java代码和html的分离,能够增强系统的功能和软件的复用性。
Java的web开发属于SUN公司定义的J2EE其中的规范。而且在J2EE中包括了java的web开发的所有方面,如:JSP、Servlet、JDBC、JNDI、JAVABEAN、EJB等等。J2EE就特别适合于做大型的企业级的应用。
二、 数据库访问比较
Java通过JDBC来访问数据库,通过不同的数据库厂商提供的数据库驱动方便地访问数据库。访问数据库的接口比较统一。
PHP对于不同的数据库采用不同的数据库访问接口,所以数据库访问代码的通用性不强。例如:用Java开发的web应用从MySQL数据库转到Oracle数据库只需要做很少的修改。而PHP则需要做大量的修改工作。
三、 系统设计架构比较
采用Java的web开发技术,需要使用的是面向对象的系统设计方法,而PHP还是采用面向过程的开发方法。所以用Java进行开发前期需要做大量的系统分析和设计的工作。
四、 跨平台性
Java和PHP都有很好的跨平台的特性。几乎都可以在不作任何修改的情况下运行在Linux或者Windows等不同的操作系统上。
五、 开发成本比较
PHP最经典的组合就是:PHP + MySQL + Apache。非常适合开发中小型的web应用,开发的速度比较快。而且所有的软件都是开源免费的,可以减少投入。
Java的web应用服务器有免费Tomcat、JBoss等,如果需要更好的商业化的服务有:Web Sphere和 Web logic。
六、 分布式多层架构比较
PHP只能实现简单的分布式两层或三层的架构,而JAVA在这方面就比较强大,可以实现多层的网络架构。数据库层(持久化层)、应用(业务)逻辑层、表示逻辑层彼此分开,而且现在不同的层都已经有一些成熟的开发框架的支持。例如Struts就是利用java的web开发技术实现了MVC的设计模式,而在业务逻辑层也有Spring框架,数据库持久化层有Hibernate等框架。这些框架可以方便开发者高效、合理、科学得架构多层的商业应用。
下面简要的说一下Struts,它实质上是在JSP Model2的基础上实现的一个MVC(Model、View、Controler)框架。JSP Model2体系结构是一种联合使用JSP 与Servlet 来提供动态内容的方法。在Struts框架中,模型由实现业务逻辑的JavaBean或EJB组件构成,控制器由Servlet实现的,视图由一组JSP文件组成。采用Struts可以明确角色的定义和开发者与网页设计者的分工。而且项目越复杂,其优势越明显。
七、 源代码安全
PHP开发的程序的源代码都是公开的,他人拿到php开发的程序后都可以进行修改。
Java开发的程序,最后用户拿到的是只是一些编译好的class类,无法看到完整的源代码,安全性高。
八、性能比较
有人做过试验,对这两种种语言分别做回圈性能测试及存取Oracle数据库测试。
在循环性能测试中,JSP只用了令人吃惊的四秒钟就结束了20000*20000的回圈。而PHP测试的是2000*2000循环(少一个数量级),却分别用了63秒。
数据库测试中,二者分别对 Oracle 8 进行 1000 次 Insert,Update,Select和Delete: JSP 需要 13 秒,PHP 需要 69 秒。
表格 1 PHP 与Java的比较
PHP JAVA
可复用性 低 高
开发速度 快 慢
易维护性 差 优
可移植性 优-Linux、Windows、Unix等
安全性 低 高
开发费用 低 高
多层架构 差 优
数据库访问 接口不统一 接口统一
可扩展性 差 优
面向对象 差 优
综上所述,我个人认为,PHP适合于快速开发,中小型应用系统,开发成本低,能够对变动的需求作出快速的反应。而Java适合于开发大型的应用系统,应用的前景比较广阔,系统易维护、可复用性较好。还有,同样功能的系统用Java开发的系统要比PHP开发的系统的价格要高。
相对于PHP4而言,PHP5有几点重要的变化和改进。按照Adam Trachtenberg的理解,PHP5有三点最重要的改进:更全面的面向对象编程功能、MySQL扩展支持库MySQLi、改进的XML支持;另外,PHP5还有以下4点重要改进:内嵌的文本型数据库SQLite、错误处理、SOAP支持、简化的枚举操作。
一、更全面的面向对象编程功能
这点的重要性是无需多讨论的。PHP3已经开始部分支持面向对象编程了,但不够成熟,在对类的操作上有不够简洁之处(例如在类创建和类销毁的时候,缺乏相应的好的机制),因此面向对象编程并不能算是PHP3的主要特性。
看上去,PHP5的面向对象功能似乎就是Java语言的翻版,实现了传统的Java里面几乎所有的面向对象编程的相关概念,以至于有人在说:是不是PHP5要被Sun公司收购了?还有人又回过头去炒一些老话题:面向对象的PHP能否击溃同样面向对象的JSP?
更优的面向对象编程能力将对PHP的发展起到非常强劲的推动作用。这体现在两点。
现有的大量的PHP系统如果从PHP4升级到PHP5后,在内在结构的设计上可以有相当的改善,并且可以更好地借用现有的一些很好的面向对象的设计模式。PHP的内涵进一步升华了,这是第一点。
当Java凌空出世的时候,有人做了些C2Java之类的软件,把C程序转换成Java程序,但是这些C2Java的软件基本上都不能很完善地工作。但可以想象的是,Java2PHP(把Java转换成PHP)这样的系统开发起来要容易的多。由于PHP的面向对象能力和Java极其相似,很多Java开发的系统可以轻松地移植、转换成PHP。我个人觉得,一些原来基于Java/JSP的系统将会转移到PHP来,而且这可能成为一个潮流。这是第二点。
二、MySQL扩展支持库MySQLi
这点也没有多少需要讨论的。当MySQL支持预处理等功能后,PHP自然也应该实现对应的功能。实际上,在数据库支持这块,MySQL要做的工作远比PHP要做的多得多。
三、改进的XML支持
这点很重要。此前给我的印象是,PHP对XML的支持始终不够强劲,对XML的处理能力比较差、不灵活,以至于好些人都避免用PHP的XML功能。如果翻阅网上大家发布的一些用PHP4写的XML相关类库,就会发现,很多人对XML操作的时候,都是使用其它方式实现的,而不是PHP里面的XML相关函数。我没有测试过PHP5对XML的支持,但相信PHP5会在这方面做得很好。
四、内嵌的文本型数据库SQLite
这个太棒了,是中小型PHP应用的福音(要知道,相当多的PHP系统都是中小型的)。我想很多PHP程序员都写过基于文本存储的应用程序(例如用文本方式保存的留言本),那种编程感觉是让人有些不爽的,尤其是在数据格式发生变更或者数据导入、导出的时候。
内嵌SQLite真是一个好想法!中小型系统由此不需要依赖MySQL或者其它数据库软件,也不必去使用脆弱的纯文本去存储数据,但是我们依然可以建造一个健壮的系统!我们开发的基于SQLite的系统未来可以轻松移植到其它数据库软件上,我们甚至可以用ADOdb去操作SQLite!
(注:如果deminy依然坚持不在deminy.net上使用MySQL之类的数据库软件的话,但至少,deminy肯定会使用SQLite来改写自己的blog、留言本等程序。2)
五、错误处理
我并没有详细阅读这方面的文档,但可以想象得到这个改进很棒。早期的PHP纵容错误的发生,并且放任错误的发生,虽然使得编程容易了点,但也导致了一些开发方面的问题。如果PHP能够在错误处理方面大大加强的话,无疑在两个方面会得到很重要的改进:一是开发过程中的错误跟踪和调试;二是系统实现(业务)过程中对于流程方面的错误处理将会更容易被合理的处理。
(对于这一点,deminy没有具体研究PHP5的新的错误处理机制,只是通过对Java和PHP相关的错误处理机制的对比而做了一些探讨,说得很泛泛。或有谬误。)
六、内置对SOAP的支持
这个很棒。我估计在PHP5之前,PHP里SOAP的实现,是需要通过第三方类库来实现的(也许PEAR里面也支持SOAP,但我不知道)。比较有名的第三方类库是NuSOAP,但我个人对NuSOAP在web上承受高压的性能不很放心(去看看NuSOAP的代码就知道了,长长的!)。
现在PHP5内置了对SOAP的支持。也许在PHP里用SOAP的人不是很多,但是对于那些在PHP中使用SOAP的人,PHP5无疑是很好的一个福音,至少,SOAP编程在PHP5里面变得明显的简单了(关于这一点可以在phpclasses.org下载SOAP相关的代码做研究)。
七、简化的枚举操作
这也是个很棒的实用型的东西,完全符合PHP的设计思想:简化编程。翻来覆去地看,PHP大体上就那么几块主要的东西:数据库操作、文件流读写、循环/枚举等。对枚举操作的高度简化是一个很棒的想法,这是PHP程序员很喜欢的一个新特性!
总结:哪些新特性更重要?
我个人觉得:更全面的面向对象编程功能是最重要的;错误处理的引入有必要,但错误处理机制执行效果如何,还有待评估;更好的MySQL扩展支持库MySQLi、改进的XML支持这两点对于较大型的PHP应用更有帮助;其它三点(内嵌的文本型数据库SQLite、内置对SOAP的支持和简化的枚举操作)则属于小敲小打类型的,但非常实用,尤其是内嵌SQLite!
因此,我对这些新特性的重要性评估如下:
1. 更全面的面向对象编程功能
2. 错误处理机制 (有待进一步评估)
3. MySQL扩展支持库MySQLi
3. 改进的XML支持
4. 内嵌的文本型数据库SQLite
5. 内置对SOAP的支持
5. 简化的枚举操作
from:
http://www.blogcn.com/u/66/27/shaoxg/blog/31649262.html
一、更全面的面向对象编程功能
这点的重要性是无需多讨论的。PHP3已经开始部分支持面向对象编程了,但不够成熟,在对类的操作上有不够简洁之处(例如在类创建和类销毁的时候,缺乏相应的好的机制),因此面向对象编程并不能算是PHP3的主要特性。
看上去,PHP5的面向对象功能似乎就是Java语言的翻版,实现了传统的Java里面几乎所有的面向对象编程的相关概念,以至于有人在说:是不是PHP5要被Sun公司收购了?还有人又回过头去炒一些老话题:面向对象的PHP能否击溃同样面向对象的JSP?
更优的面向对象编程能力将对PHP的发展起到非常强劲的推动作用。这体现在两点。
现有的大量的PHP系统如果从PHP4升级到PHP5后,在内在结构的设计上可以有相当的改善,并且可以更好地借用现有的一些很好的面向对象的设计模式。PHP的内涵进一步升华了,这是第一点。
当Java凌空出世的时候,有人做了些C2Java之类的软件,把C程序转换成Java程序,但是这些C2Java的软件基本上都不能很完善地工作。但可以想象的是,Java2PHP(把Java转换成PHP)这样的系统开发起来要容易的多。由于PHP的面向对象能力和Java极其相似,很多Java开发的系统可以轻松地移植、转换成PHP。我个人觉得,一些原来基于Java/JSP的系统将会转移到PHP来,而且这可能成为一个潮流。这是第二点。
二、MySQL扩展支持库MySQLi
这点也没有多少需要讨论的。当MySQL支持预处理等功能后,PHP自然也应该实现对应的功能。实际上,在数据库支持这块,MySQL要做的工作远比PHP要做的多得多。
三、改进的XML支持
这点很重要。此前给我的印象是,PHP对XML的支持始终不够强劲,对XML的处理能力比较差、不灵活,以至于好些人都避免用PHP的XML功能。如果翻阅网上大家发布的一些用PHP4写的XML相关类库,就会发现,很多人对XML操作的时候,都是使用其它方式实现的,而不是PHP里面的XML相关函数。我没有测试过PHP5对XML的支持,但相信PHP5会在这方面做得很好。
四、内嵌的文本型数据库SQLite
这个太棒了,是中小型PHP应用的福音(要知道,相当多的PHP系统都是中小型的)。我想很多PHP程序员都写过基于文本存储的应用程序(例如用文本方式保存的留言本),那种编程感觉是让人有些不爽的,尤其是在数据格式发生变更或者数据导入、导出的时候。
内嵌SQLite真是一个好想法!中小型系统由此不需要依赖MySQL或者其它数据库软件,也不必去使用脆弱的纯文本去存储数据,但是我们依然可以建造一个健壮的系统!我们开发的基于SQLite的系统未来可以轻松移植到其它数据库软件上,我们甚至可以用ADOdb去操作SQLite!
(注:如果deminy依然坚持不在deminy.net上使用MySQL之类的数据库软件的话,但至少,deminy肯定会使用SQLite来改写自己的blog、留言本等程序。2)
五、错误处理
我并没有详细阅读这方面的文档,但可以想象得到这个改进很棒。早期的PHP纵容错误的发生,并且放任错误的发生,虽然使得编程容易了点,但也导致了一些开发方面的问题。如果PHP能够在错误处理方面大大加强的话,无疑在两个方面会得到很重要的改进:一是开发过程中的错误跟踪和调试;二是系统实现(业务)过程中对于流程方面的错误处理将会更容易被合理的处理。
(对于这一点,deminy没有具体研究PHP5的新的错误处理机制,只是通过对Java和PHP相关的错误处理机制的对比而做了一些探讨,说得很泛泛。或有谬误。)
六、内置对SOAP的支持
这个很棒。我估计在PHP5之前,PHP里SOAP的实现,是需要通过第三方类库来实现的(也许PEAR里面也支持SOAP,但我不知道)。比较有名的第三方类库是NuSOAP,但我个人对NuSOAP在web上承受高压的性能不很放心(去看看NuSOAP的代码就知道了,长长的!)。
现在PHP5内置了对SOAP的支持。也许在PHP里用SOAP的人不是很多,但是对于那些在PHP中使用SOAP的人,PHP5无疑是很好的一个福音,至少,SOAP编程在PHP5里面变得明显的简单了(关于这一点可以在phpclasses.org下载SOAP相关的代码做研究)。
七、简化的枚举操作
这也是个很棒的实用型的东西,完全符合PHP的设计思想:简化编程。翻来覆去地看,PHP大体上就那么几块主要的东西:数据库操作、文件流读写、循环/枚举等。对枚举操作的高度简化是一个很棒的想法,这是PHP程序员很喜欢的一个新特性!
总结:哪些新特性更重要?
我个人觉得:更全面的面向对象编程功能是最重要的;错误处理的引入有必要,但错误处理机制执行效果如何,还有待评估;更好的MySQL扩展支持库MySQLi、改进的XML支持这两点对于较大型的PHP应用更有帮助;其它三点(内嵌的文本型数据库SQLite、内置对SOAP的支持和简化的枚举操作)则属于小敲小打类型的,但非常实用,尤其是内嵌SQLite!
因此,我对这些新特性的重要性评估如下:
1. 更全面的面向对象编程功能
2. 错误处理机制 (有待进一步评估)
3. MySQL扩展支持库MySQLi
3. 改进的XML支持
4. 内嵌的文本型数据库SQLite
5. 内置对SOAP的支持
5. 简化的枚举操作
from:
http://www.blogcn.com/u/66/27/shaoxg/blog/31649262.html
有时搞一些跨网段的工程和应用,需要尽量准确的知道电信、网通、铁通等电信运营商的IP地址段分配情况,可网上的资料不但很少,而且经常都是N个月前的过期资料……
APNIC是管理亚太地区IP地址分配的机构,它有着丰富准确的IP地址分配库,同时这些信息也是对外公开的!下面就让我们看看如何在Linux下获得一些电信运营商的IP地址分配情况:
shell> wget http://ftp.apnic.net/apnic/dbase/tools/ripe-dbase-client-v3.tar.gz
shell> tar xzvf ripe-dbase-client-v3.tar.gz
shell> cd whois-3.1
shell> ./configure
shell> make
完成上述编译安装工作后,我们开始获取IP地址段;
中国网通:
shell> ./whois3 -h whois.apnic.net -l -i mb MAINT-CNCGROUP > /var/cnc
中国电信:
shell> ./whois3 -h whois.apnic.net -l -i mb MAINT-CHINANET > /var/chinanet
中国铁通:
shell> ./whois3 -h whois.apnic.net -l -i mb MAINT-CN-CRTC > /var/crtc
打开获取后的文件可以看到里面的信息非常详细,甚至可以看到各个分公司的负责人、电话、电子邮件等等信息。如果想得到一份整齐干净的IP地址段文件,只要用grep和awk简单过滤就可以了:)
APNIC是管理亚太地区IP地址分配的机构,它有着丰富准确的IP地址分配库,同时这些信息也是对外公开的!下面就让我们看看如何在Linux下获得一些电信运营商的IP地址分配情况:
shell> wget http://ftp.apnic.net/apnic/dbase/tools/ripe-dbase-client-v3.tar.gz
shell> tar xzvf ripe-dbase-client-v3.tar.gz
shell> cd whois-3.1
shell> ./configure
shell> make
完成上述编译安装工作后,我们开始获取IP地址段;
中国网通:
shell> ./whois3 -h whois.apnic.net -l -i mb MAINT-CNCGROUP > /var/cnc
中国电信:
shell> ./whois3 -h whois.apnic.net -l -i mb MAINT-CHINANET > /var/chinanet
中国铁通:
shell> ./whois3 -h whois.apnic.net -l -i mb MAINT-CN-CRTC > /var/crtc
打开获取后的文件可以看到里面的信息非常详细,甚至可以看到各个分公司的负责人、电话、电子邮件等等信息。如果想得到一份整齐干净的IP地址段文件,只要用grep和awk简单过滤就可以了:)
方法一:
$str = "超越PHP";
if (preg_match("/^[".chr(0xa1)."-".chr(0xff)."]+$/", $str)) {
echo "这是一个纯中文字符串";
} else {
echo "这不是一个纯中文字串";
}
方法二:
//判断是否为中文
//$str:待检测的字串
//$loum:错误时返回的字段显示名称
function fun_china($str,$loum=""){
$str_arr=strlen($str);
$str_count=count($str_arr);
for($i=0; $i<$str_count; $i++)
{
if (ord($str[$i]) < 128)
{
showerror($loum."应为中文,请检查!");
exit;
}
}
}
$str = "超越PHP";
if (preg_match("/^[".chr(0xa1)."-".chr(0xff)."]+$/", $str)) {
echo "这是一个纯中文字符串";
} else {
echo "这不是一个纯中文字串";
}
方法二:
//判断是否为中文
//$str:待检测的字串
//$loum:错误时返回的字段显示名称
function fun_china($str,$loum=""){
$str_arr=strlen($str);
$str_count=count($str_arr);
for($i=0; $i<$str_count; $i++)
{
if (ord($str[$i]) < 128)
{
showerror($loum."应为中文,请检查!");
exit;
}
}
}
* 作者:heiyeluren
* 时间:2006-03-05
* 博客:http://blog.csdn.net/heiyeshuwu
[ Web Service介绍 ]
Web Service就是为了异构系统的通信而产生的,它基本的思想就是使用基于XML的HTTP的远程调用提供一种标准的机制,而省去建立一种新协议的需求。目前进行Web Service通信有两种协议标准,一种是XML-RPC,另外一种是SOAP。XML-RPC比较简单,出现时间比较早,SOAP比较复杂,主要是一些需要稳定、健壮、安全并且复杂交互的时候使用。
PHP中集成了XML-RPC和SOAP两种协议的访问,都是集中在xmlrpc扩展当中。另外,在PHP的PEAR中,不管是PHP 4还是PHP 5,都已经默认集成了XML-RPC扩展,而且该扩展跟xmlrpc扩展无关,能够独立实现XML-RPC的协议交互,如果没有xmlrpc扩展,建议使用PEAR::XML-RPC扩展。
我们这里主要是以XML-RPC来简单描述Web Service的交互过程,部分内容来自PHP手册,更详细内容,建议参考手册。
[ 安装xmlrpc扩展 ]
如果你的系统中没有安装xmlrpc的php扩展,那么请正确安装。
在Windows平台下,首先把PHP安装目录下的扩展php_xmlrpc.dll放到C:Windows或者C:Winnt目录下,(PHP4的扩展在C:phpextensions目录中,PHP5的扩展在C:phpext目录中),同时在C:Windowsphp.ini或者C:Winntphp.ini中把extension=php_xmlrpc.dll前面的分号";"去掉,然后重启Web服务器后查看phpinfo()有没有XML-RPC项目就能够确定是否已经正确安装xmlrpc扩展。
在Unix/Linux平台下,如果没有安装xmlrpc扩展,请在重新编译PHP,在configure的时候请加入 --with-xmlrpc 选项,然后查看phpinfo()看是否正常安装xmlrpc。
(注意:以下操作都是建立在xmlrpc扩张正常安装前提下,请务必正确安装。)
[ XML-RPC工作原理 ]
XML-RPC大致就是整个过程就是使用XML来进行通信。首先构造一个RPC 服务器端用来出来从RPC客户端传递过来的使用XML封装的请求,并且把处理结果通过XML的形式返回给RPC客户端,客户端就去分析XML获取自己需要的数据。
XML-RPC的服务器端必须有现成的函数提供给客户端调用,并且客户端提交的请求中的函数和方法必须和服务器端的一致,否则将无法获取所需要的结果。
下面我进行简单的代码来描述整个过程。
[ XML-RPC实践 ]
服务器端使用xmlrpc_server_create函数产生一个服务器端,然后把需要需要暴露的RPC调用接口进行注册,接受RPC客户端POST过来的XML数据,然后进行处理,处理结果通过XML的形式显示给客户端。
代码如下: rpc_server.php
服务器端构造好了,那么再构造我们的RPC客户端。客户端大致通过Socket访问XML-RPC服务器端的80端口,然后把需要调用的RPC接口封装到XML里,通过POST请求提交给RPC服务器端,最后获取服务器端返回结果。
代码如下:rpc_client.php
[code]<?php
/**
* 函数:提供给客户端进行连接XML-RPC服务器端的函数
* 参数:
* $host 需要连接的主机
* $port 连接主机的端口
* $rpc_server XML-RPC服务器端文件
* $request 封装的XML请求信息
* 返回:连接成功成功返回由服务器端返回的XML信息,失败返回false
*/
function rpc_client_call($host, $port, $rpc_server, $request) {
//打开指定的服务器端
$fp = fsockopen($host, $port);
//构造需要进行通信的XML-RPC服务器端的查询POST请求信息
$query = "POST $rpc_server HTTP/1.0 User_Agent: XML-RPC Client Host: ".$host." Content-Type: text/xml Content-Length: ".strlen($request)." ".$request." ";
//把构造好的HTTP协议发送给服务器,失败返回false
if (!fputs($fp, $query, strlen($query)))
{
$errstr = "Write error";
return false;
}
//获取从服务器端返回的所有信息,包括HTTP头和XML信息
$contents = '''';
while (!feof($fp))
{
$contents .= fgets($fp);
}
//关闭连接资源后返回获取的内容
fclose($fp);
return $contents;
}
//构造连接RPC服务器端的信息
$host = ''localhost'';
$port = 80;
$rpc_server = ''/~heiyeluren/rpc_server.php'';
//把需要发送的XML请求进行编码成XML,需要调用的方法是rpc_server,参数是get
$request = xmlrpc_encode_request(''rpc_server'', ''get'');
//调用rpc_client_call函数把所有请求发送给XML-RPC服务器端后获取信息
$response = rpc_client_call($host, $port, $rpc_server, $request);
//分析从服务器端返回的XML,去掉HTTP头信息,并且把XML转为PHP能识别的字符串
$split = ''<?xml version="1.0" encoding="iso-8859-1"?>'';
$xml = explode($split, $response);
$xml = $split . array_pop($xml);
$response = xmlrpc_decode($xml);
//输出从RPC服务器端获取的信息
print_r($response);
?> [/code]
大致我们上面的例子就是提交一个叫做rpc_server的方法过去,参数是get,然后获取服务器端的返回,服务器端返回的XML数据是:
那么我们再通过xmlrpc_decode函数把这个XML编码为PHP的字符串,我们就能够随意处理了,整个Web Service交互完成。
[ 结束语 ]
不管是XML-RPC也好,SOAP也罢,只要能够让我们稳定、安全的进行远程过程的调用,完成我们的项目,那么就算整个Web Service就是成功的。另外,如果可以的话,也可以尝试使用PEAR中的XML-RPC来实现上面类似的操作,说不定会更简单,更适合你使用。
简单的使用XML-RPC进行Web Service交互就完成了,部分代码参考PHP手册,想获取详细信息建议参考手册,如果文章有不正确,请指正。
本栏文章均来自于互联网,版权归原作者和各发布网站所有,本站收集这些文章仅供学习参考之用。任何人都不能将这些文章用于商业或者其他目的。( ProgramFan.Com )
* 时间:2006-03-05
* 博客:http://blog.csdn.net/heiyeshuwu
[ Web Service介绍 ]
Web Service就是为了异构系统的通信而产生的,它基本的思想就是使用基于XML的HTTP的远程调用提供一种标准的机制,而省去建立一种新协议的需求。目前进行Web Service通信有两种协议标准,一种是XML-RPC,另外一种是SOAP。XML-RPC比较简单,出现时间比较早,SOAP比较复杂,主要是一些需要稳定、健壮、安全并且复杂交互的时候使用。
PHP中集成了XML-RPC和SOAP两种协议的访问,都是集中在xmlrpc扩展当中。另外,在PHP的PEAR中,不管是PHP 4还是PHP 5,都已经默认集成了XML-RPC扩展,而且该扩展跟xmlrpc扩展无关,能够独立实现XML-RPC的协议交互,如果没有xmlrpc扩展,建议使用PEAR::XML-RPC扩展。
我们这里主要是以XML-RPC来简单描述Web Service的交互过程,部分内容来自PHP手册,更详细内容,建议参考手册。
[ 安装xmlrpc扩展 ]
如果你的系统中没有安装xmlrpc的php扩展,那么请正确安装。
在Windows平台下,首先把PHP安装目录下的扩展php_xmlrpc.dll放到C:Windows或者C:Winnt目录下,(PHP4的扩展在C:phpextensions目录中,PHP5的扩展在C:phpext目录中),同时在C:Windowsphp.ini或者C:Winntphp.ini中把extension=php_xmlrpc.dll前面的分号";"去掉,然后重启Web服务器后查看phpinfo()有没有XML-RPC项目就能够确定是否已经正确安装xmlrpc扩展。
在Unix/Linux平台下,如果没有安装xmlrpc扩展,请在重新编译PHP,在configure的时候请加入 --with-xmlrpc 选项,然后查看phpinfo()看是否正常安装xmlrpc。
(注意:以下操作都是建立在xmlrpc扩张正常安装前提下,请务必正确安装。)
[ XML-RPC工作原理 ]
XML-RPC大致就是整个过程就是使用XML来进行通信。首先构造一个RPC 服务器端用来出来从RPC客户端传递过来的使用XML封装的请求,并且把处理结果通过XML的形式返回给RPC客户端,客户端就去分析XML获取自己需要的数据。
XML-RPC的服务器端必须有现成的函数提供给客户端调用,并且客户端提交的请求中的函数和方法必须和服务器端的一致,否则将无法获取所需要的结果。
下面我进行简单的代码来描述整个过程。
[ XML-RPC实践 ]
服务器端使用xmlrpc_server_create函数产生一个服务器端,然后把需要需要暴露的RPC调用接口进行注册,接受RPC客户端POST过来的XML数据,然后进行处理,处理结果通过XML的形式显示给客户端。
代码如下: rpc_server.php
<?php
/**
* 函数:提供给RPC客户端调用的函数
* 参数:
* $method 客户端需要调用的函数
* $params 客户端需要调用的函数的参数数组
* 返回:返回指定调用结果
*/
function rpc_server_func($method, $params) {
$parameter = $params[0];
if ($parameter == "get")
{
$return = ''This data by get method'';
}
else
{
$return = ''Not specify method or params'';
}
return $return;
}
//产生一个XML-RPC的服务器端
$xmlrpc_server = xmlrpc_server_create();
//注册一个服务器端调用的方法rpc_server,实际指向的是rpc_server_func函数
xmlrpc_server_register_method($xmlrpc_server, "rpc_server", "rpc_server_func");
//接受客户端POST过来的XML数据
$request = $HTTP_RAW_POST_DATA;
//执行调用客户端的XML请求后获取执行结果
$xmlrpc_response = xmlrpc_server_call_method($xmlrpc_server, $request, null);
//把函数处理后的结果XML进行输出
header(''Content-Type: text/xml'');
echo $xmlrpc_response;
//销毁XML-RPC服务器端资源
xmlrpc_server_destroy($xmlrpc_server);
?>
/**
* 函数:提供给RPC客户端调用的函数
* 参数:
* $method 客户端需要调用的函数
* $params 客户端需要调用的函数的参数数组
* 返回:返回指定调用结果
*/
function rpc_server_func($method, $params) {
$parameter = $params[0];
if ($parameter == "get")
{
$return = ''This data by get method'';
}
else
{
$return = ''Not specify method or params'';
}
return $return;
}
//产生一个XML-RPC的服务器端
$xmlrpc_server = xmlrpc_server_create();
//注册一个服务器端调用的方法rpc_server,实际指向的是rpc_server_func函数
xmlrpc_server_register_method($xmlrpc_server, "rpc_server", "rpc_server_func");
//接受客户端POST过来的XML数据
$request = $HTTP_RAW_POST_DATA;
//执行调用客户端的XML请求后获取执行结果
$xmlrpc_response = xmlrpc_server_call_method($xmlrpc_server, $request, null);
//把函数处理后的结果XML进行输出
header(''Content-Type: text/xml'');
echo $xmlrpc_response;
//销毁XML-RPC服务器端资源
xmlrpc_server_destroy($xmlrpc_server);
?>
服务器端构造好了,那么再构造我们的RPC客户端。客户端大致通过Socket访问XML-RPC服务器端的80端口,然后把需要调用的RPC接口封装到XML里,通过POST请求提交给RPC服务器端,最后获取服务器端返回结果。
代码如下:rpc_client.php
[code]<?php
/**
* 函数:提供给客户端进行连接XML-RPC服务器端的函数
* 参数:
* $host 需要连接的主机
* $port 连接主机的端口
* $rpc_server XML-RPC服务器端文件
* $request 封装的XML请求信息
* 返回:连接成功成功返回由服务器端返回的XML信息,失败返回false
*/
function rpc_client_call($host, $port, $rpc_server, $request) {
//打开指定的服务器端
$fp = fsockopen($host, $port);
//构造需要进行通信的XML-RPC服务器端的查询POST请求信息
$query = "POST $rpc_server HTTP/1.0 User_Agent: XML-RPC Client Host: ".$host." Content-Type: text/xml Content-Length: ".strlen($request)." ".$request." ";
//把构造好的HTTP协议发送给服务器,失败返回false
if (!fputs($fp, $query, strlen($query)))
{
$errstr = "Write error";
return false;
}
//获取从服务器端返回的所有信息,包括HTTP头和XML信息
$contents = '''';
while (!feof($fp))
{
$contents .= fgets($fp);
}
//关闭连接资源后返回获取的内容
fclose($fp);
return $contents;
}
//构造连接RPC服务器端的信息
$host = ''localhost'';
$port = 80;
$rpc_server = ''/~heiyeluren/rpc_server.php'';
//把需要发送的XML请求进行编码成XML,需要调用的方法是rpc_server,参数是get
$request = xmlrpc_encode_request(''rpc_server'', ''get'');
//调用rpc_client_call函数把所有请求发送给XML-RPC服务器端后获取信息
$response = rpc_client_call($host, $port, $rpc_server, $request);
//分析从服务器端返回的XML,去掉HTTP头信息,并且把XML转为PHP能识别的字符串
$split = ''<?xml version="1.0" encoding="iso-8859-1"?>'';
$xml = explode($split, $response);
$xml = $split . array_pop($xml);
$response = xmlrpc_decode($xml);
//输出从RPC服务器端获取的信息
print_r($response);
?> [/code]
大致我们上面的例子就是提交一个叫做rpc_server的方法过去,参数是get,然后获取服务器端的返回,服务器端返回的XML数据是:
<?xml version="1.0" encoding="iso-8859-1"?>
<methodResponse>
<params>
<param>
<value>
<string>This data by get method</string>
</value>
</param>
</params>
</methodResponse>
<methodResponse>
<params>
<param>
<value>
<string>This data by get method</string>
</value>
</param>
</params>
</methodResponse>
那么我们再通过xmlrpc_decode函数把这个XML编码为PHP的字符串,我们就能够随意处理了,整个Web Service交互完成。
[ 结束语 ]
不管是XML-RPC也好,SOAP也罢,只要能够让我们稳定、安全的进行远程过程的调用,完成我们的项目,那么就算整个Web Service就是成功的。另外,如果可以的话,也可以尝试使用PEAR中的XML-RPC来实现上面类似的操作,说不定会更简单,更适合你使用。
简单的使用XML-RPC进行Web Service交互就完成了,部分代码参考PHP手册,想获取详细信息建议参考手册,如果文章有不正确,请指正。
本栏文章均来自于互联网,版权归原作者和各发布网站所有,本站收集这些文章仅供学习参考之用。任何人都不能将这些文章用于商业或者其他目的。( ProgramFan.Com )
加密解密的算法实例:
$key = "This is supposed to be a secret key !!!";
function keyED($txt,$encrypt_key)
{
$encrypt_key = md5($encrypt_key);
$ctr=0;
$tmp = "";
for ($i=0;$i<strlen($txt);$i++)
{
if ($ctr==strlen($encrypt_key)) $ctr=0;
$tmp.= substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1);
$ctr++;
}
return $tmp;
}
function keyED($txt,$encrypt_key)
{
$encrypt_key = md5($encrypt_key);
$ctr=0;
$tmp = "";
for ($i=0;$i<strlen($txt);$i++)
{
if ($ctr==strlen($encrypt_key)) $ctr=0;
$tmp.= substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1);
$ctr++;
}
return $tmp;
}






