加载中…
个人资料
朱彦斌
朱彦斌
  • 博客等级:
  • 博客积分:0
  • 博客访问:20,008
  • 关注人气:1
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

【原创】SOAP性能测试及分析

(2006-05-16 16:16:29)
分类: PHP
1、为什么使用SOAP及SOAP的优点?
• 强大的类型扩展 (SOAP)
• 用户自定义字符集,如US-ASCII, UTF-8, UTF-16 (SOAP)
• Specifies recipient (SOAP)
• 容器遇到无法理解的报文则失败 (SOAP)
• 易于使用 (XML-RPC)
• 设计简单 (XML-RPC)
在传输复合型数据时,使用SOAP不需要对数据进行复杂操作,不需要我们再去对数据进行分离,而且在服务器端修改数据结构时,客户端基本上不需要修改。
2、测试方案
在同一服务器环境及同一客户端环境下测试PHP4下的SOAP性能,,PHP5下的SOAP的性能以及使用file_get_contents的性能分析。
3、测试代码
分别在PHP4.4.2及PHP5.1.2环境下测试SOAP的测试代码
3.1 PHP4.4.2下的测试代码:
3.1.1 Client.php文件
<?php
$stime = getmicrotime();
//simple client
require('nusoap.php');

//要发送的变量
$myString="world";

//parameters must be passed as an array
//变量必须要转换成数组的形式
$parameters=array($myString);

//创建一个soapclient对象,参数是server的URL
$s=new soapclient('http://127.0.0.1/soap/server1.php');

//调用远程方法,返回值存放在$result
//返回值为PHP的变量类型,如string, integer, array
$result=$s->call('echoString', $parameters);

//错误检测
if (!$err=$s->getError()) {
echo 'Result: '.$result; //success
} else {
echo 'Error: '.$err;
}

//调试,以下是SOAP请求(request)和回应(response)的报文,包括HTTP头
//echo "<xmp>".$s->request."</xmp>";
//echo "<xmp>".$s->response."</xmp>";
$etime = getmicrotime();

echo "<br/>Time: " . ($etime - $stime);
function getmicrotime()
{
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}
?>
3.1.2 Server1.php文件
<?php
//simple server
require('nusoap.php');

//创建一个新的soap_server对象,并注册允许远程调用的方法
$s=new soap_server;
$s->register('echoString');
$s->register('echoArray');

/*
[文章中说: 缺少了注册这一步,任何PHP函数都将可以进行远程调用,这将是一个极大的安全隐患。但是我尝试过注册是必须的。而且只有将结果return的函数才能直接声明为远程方法,比如echo
()就不行,而strtolower()就可以。]
*/

function echoString($inputString) {
//类性检查
if(is_string($inputString)) {
return "Hello, ".$inputString;
} else {
//soap_fault类用于产生错误信息
return new soap_fault('client', '', 'The parameter to this service must be a string.');
//soap_fault(faultcode, faultactor, faultstring, faultdetail);
//上面是错误处理类的构造函数的格式
//faultcode 必须值。可以设置为client或server,来表明错误发生在哪一端。
//faultactor 在NuSOAP中尚未实现。
//faultstring 错误信息。
//faultdetail 详细错误信息。你可以使用XML标记。

//除了构造函数外,soap_fault类还有一个serialize()方法
//它将错误信息序列化,然后返回一个完整的SOAP报文,范例:
/*
$fault = new soap_fault('client', '', 'The inputString parameter must not be empty');
echo $fault->serialize();
*/
}
}

//演示数组类型的使用
function echoArray($inputString) {
return $inputString[0]."+".$inputString[1];

}

//最后一步是把所有的收到的post数据都传递给SOAP server的service方法。它将处理请求,并调用相应的函数。
$s->service($HTTP_RAW_POST_DATA);
?>
3.1.3 nusoap.php 文件
因此类库太大,见附件。
3.2 PHP5.1.2下的测试代码
3.2.1 server1.Php文件
<?php
$quotes = array(
"ibm" => 98.4244,
);

function getQuote($symbol) {
global $quotes;
return $quotes[$symbol];
}

ini_set("soap.wsdl_cache_enabled", "0"); // disabling WSDL cache
$server = new SoapServer("stockquote.wsdl");
$server->addFunction("getQuote");
$server->handle();
?>
3.2.2 client1.php文件
<?php
$stime = getmicrotime();
function getmicrotime()
{
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}
$client = new SoapClient("stockquote.wsdl");
print($client->getQuote("ibm"));
$etime = getmicrotime();

echo "<br/>Time: " . ($etime - $stime);
?>

3.2.3 stockquote.wsdl文件
<?xml version ='1.0' encoding ='UTF-8' ?>
<definitions name='StockQuote'
targetNamespace='http://example.org/StockQuote'
xmlns:tns=' http://example.org/StockQuote '
xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/'
xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'
xmlns='http://schemas.xmlsoap.org/wsdl/'>

<message name='getQuoteRequest'>
<part name='symbol' type='xsd:string'/>
</message>
<message name='getQuoteResponse'>
<part name='Result' type='xsd:float'/>
</message>

<portType name='StockQuotePortType'>
<operation name='getQuote'>
<input message='tns:getQuoteRequest'/>
<output message='tns:getQuoteResponse'/>
</operation>
</portType>

<binding name='StockQuoteBinding' type='tns:StockQuotePortType'>
<soap:binding style='rpc'
transport='http://schemas.xmlsoap.org/soap/http'/>
<operation name='getQuote'>
<soap:operation soapAction='urn:xmethods-delayed-quotes#getQuote'/>
<input>
<soap:body use='encoded' namespace='urn:xmethods-delayed-quotes'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</input>
<output>
<soap:body use='encoded' namespace='urn:xmethods-delayed-quotes'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</output>
</operation>
</binding>

<service name='StockQuoteService'>
<port name='StockQuotePort' binding='StockQuoteBinding'>
<soap:address location='http://10.215.20.44:5555/soap/server1.php'/>
</port>
</service>
</definitions>
3.3 file_get_contents() 方法
3.3.1 hello.php文件
<?php
echo "hello,word! ";
?>
3.3.2 read.php文件
<?php
$stime = getmicrotime();
$str = file_get_contents("http://127.0.0.1/file/hello.php");
echo $str;
$etime = getmicrotime();

echo "<br/>Time: " . ($etime - $stime);
function getmicrotime()
{
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}
?>
4、测试环境
4.1 PHP4测试环境
Server :
OS : CENT-OS
CPU : Pentium III 927.765
Memory : 1035912 KB
Apache : 2.0.55
PHP : 4.4.1
SOAP : NUSOAP (PHP4 Extension, built by php4)

Client :
OS : WINDOWS XP
CPU : Pentium(R) 4 2.8G
Memory : 512MB
Software : IE 6.0
4.2 PHP5测试环境
Server :
OS : CENT-OS
CPU : Pentium III 927.765
Memory : 1035912 KB
Apache : 2.0.55
PHP : 5.1.2
SOAP : Built-in Modules. This modules is supported on php5 or more than.

Client :
OS : WINDOWS XP
CPU : Pentium(R) 4 2.8G
Memory : 512MB
Software : IE 6.0
5、测试结果
次数 PHP4所花时间(单位:秒) PHP5所花时间(单位:秒) File_get_contents()
1 0.0409491062164 0.0047550201416016 0.00215101242065
2 0.042445898056 0.0046920776367188 0.00213193893433
3 0.0416808128357 0.0047509670257568 0.0021960735321
4 0.0426590442657 0.0046899318695068 0.00212693214417
5 0.0407590866089 0.0046591758728027 0.00214505195618

6、结果分析
从测试结果,我们可以得出以下结论:
效率关系:
PHP4的NUSOAP < PHP5的SOAP < file_get_contents

开发难度:
file_get_contents < PHP4的NUSOAP < PHP5的SOAP

数据的可操作性:
file_get_contents < PHP4的NUSOAP = PHP5的SOAP
7、附录
7.1 什么是SOAP?
SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息并执行远程过程调用的协议,是一个基于XML的协议。使用SOAP,不用考虑任何特定的传输协议(最常用的还是HTTP协议),可以允许任何类型的对象或代码,在任何平台上,以任何一直语言相互通信。这种相互通信采用的是XML格式的消息,如:

SOAP包括四个部分:SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;SOAP编码规则(encoding rules),用于表示应用程序需要使用的数据类型的实例;SOAP RPC表示(RPC representation),表示远程过程调用和应答的协定;SOAP绑定(binding),使用底层协议交换信息。
应用中比较关注的是envelop,由一个或多个Header和一个Body组成。
7.2 什么是XML?
• XML是EXtensible Markup Language的缩写
• XML是一种类似于HTML的标记语言
• XML是用来描述数据的
• XML的标记不是在XML中预定义的,你必须定义自己的标记
• XML使用文档类型定义(DTD)或者模式(Schema)来描述数据
• XML使用DTD或者Schema后就是自描述的语言
7.3 什么是WSDL?
WSDL(Web Service Description Language)Web服务器描述语言是用XML文档来描述Web服务的标准,是Web服务的接口定义语言,由Ariba、Intel、IBM、MS等共同提出,通过WSDL,可描述Web服务的三个基本属性:
•服务做些什么——服务所提供的操作(方法)
•如何访问服务——和服务交互的数据格式以及必要协议
•服务位于何处——协议相关的地址,如URL
WSDL文档以端口集合的形式来描述Web服务,WSDL 服务描述包含对一组操作和消息的一个抽象定义,绑定到这些操作和消息的一个具体协议,和这个绑定的一个网络端点规范。WSDL 文档被分为两种类型:服务接口(service interface )和 服务实现(service implementations),文档基本结构框架如下:

服务接口文档中的主要元素作用分别为:
types:定义了Web服务使用的所有数据类型集合,可被元素的各消息部件所引用。它使用某种类型系统(一般地使用XML Schema中的类型系统)。
message:通信消息数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构。
operation:对服务中所支持操作的抽象描述。一般单个operation描述了一个访问入口的请求/响应消息对。
portType:对于某个访问入口点类型所支持操作的抽象集合。这些操作可以由一个或多个服务访问点来支持。
binding:包含了如何将抽象接口的元素(portType)转变为具体表示的细节,具体表示也就是指特定的数据格式和协议的结合;特定端口类型的具体协议和数据格式规范的绑定。
port:定义为协议/数据格式绑定与具体Web访问地址组合的单个服务访问点。
service:这是一个粗糙命名的元素,代表端口的集合;相关服务访问点的集合。
  可见,portType(与message和type元素的细节相结合)描述了Web服务是什么,binding元素描述了如何使用Web服务,port及service元素描述了Web服务的位置。
7.4 官方相关文档
PHP5 SOAP官方文档:http://www.zend.com/php5/articles/php5-SOAP.php
NUSOAP官方文档: http://dietrich.ganx4.com/nusoap/

W3C的SOAP文档1.1版:http://www.w3.org/TR/2000/NOTE-SOAP-20000508/

W3C的SOAP文档1.2版:http://www.w3.org/TR/2003/REC-soap12-part0-20030624/
http://www.w3.org/TR/2003/REC-soap12-part1-20030624/
http://www.w3.org/TR/2003/REC-soap12-part2-20030624/

W3C的WSDL文档: http://www.w3.org/TR/2001/NOTE-wsdl-20010315

W3C的XML Schema: http://www.w3.org/TR/2001/REC-xmlschema-1-20010502/
http://www.w3.org/TR/2001/REC-xmlschema-1-20010502/

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有