使用php来实现网络服务

作者:samisa
以下文中的翻译名称对照表 :
payload: 交谈内容
object: 实例
function: 函数
使用 php来实现网络服务
使用框架: WSO2 WSF/PHP
安装环境: windows 或者 linux
(厌恶于眼下计算机文章夹杂无数难懂的翻译以及术语,此处尽量使用口语以及汉语。)
WSMessages 类:
在调用网络服务的过程中,需要两个消息,发送的消息和接受的消息,又来有往方能来往不是。 WSMessages 这个类就是在 Web services framework for php (简称 WSF)这个开源框架中,用来封装这两个消息的类。
WSMessages 有一个很重要的变量 str来保存消息内容,以 xml格式来保存“有效的载荷” (他们把这个叫做 payload,我查英文字典,就是这个意思,但是它来回的出现,反复的出现,今观之,也就是交谈内容,实际上就是除去那些 xml的定义,以及一些其他的所谓‘命名空间' ->namespace的定义而已。要搞清楚什么是命名空间,请查看 xml的 W3C定义 )。有效载荷实在是莫名其妙,我以后还是用‘交谈内容'来指代它把。
如果你通过客户程序发送一个请求,那么你需要构造一个 WSMessage 的实例,并且用 xml形式的交谈内容填写好这个实例。对应请求的回应,也还是一个‘交谈内容'会通过你的程序返回,并且返回的东西也仍然是一个 WSMessage 实例。
也就是说,你的客户端函数掉应一个网络服务,那么他的返回值也是一个 WSMessage 实例。
你可以在一个函数中发送请求,调用网络服务的程序,并且把返回内容放在 WSMessage实例中,并且让函数返回这个 WSMessage实例。
WSMessage 更倾向于发送和接受比较复杂的内容比如有附件什么的。下面就来详细解释一下如何使用 WSMessage 来实现客户端和服务端的交流。
处理交谈内容:
在此之前已经讲解过如何使用 php来创建网络服务,并且已经做了一个简单的客户 -服务端程序来说明工作流程。但是这些程序并没有深入的解释我们怎么处理‘交谈内容'。换句话来说,我们只是把 xml格式的交谈内容发送到了服务端,但并没有想到去处理它。在这里,我们来详细的解释一下如何处理交谈内容并且把它用到计算程序中去。
交谈内容是一个商业逻辑定义的内容,并且用 SOAP( Simple Object Access Protocol)来封装的,(请参见 SOAP w3c的文章)。让我们用个例子来说明如何计算一个阶乘吧。
客户端需要发送的交谈内容:
<getFactorial>
<param>6</param>
</getFactorial>
服务端需要明白这个交谈内容并且把变量分辨出来并且计算它的阶乘。下面就是服务端程序:
function getFactorial ( $message ) {
$simplexml = new SimpleXMLElement ( $message -> str ) ;
$value = $simplexml -> param [ 0 ] ;
$result = factorial ( $value ) ;
$responsePayloadString = <<<XML
<getFactorialResponse>
<result> $result </result>
</getFactorialResponse>
XML;
return $responsePayloadString ;
}
第 3行,我们用输入的‘交谈内容'创建了一个 simpleXmlElement 的实例。你可以看到,输入的交谈内容被保存到了通过函数参数传递进来的 WSMessage 实例 $message的 str变量中。注: SimpleXml是一个 php的扩展,用于处理 xml文件或者字符串。 WSO2 WSF/PHP并没有规定我们必须使用哪一个 php扩展来处理 xml。你可以使用你喜欢的人和 xml php 扩展来处理,比如 domdocument, saxdom之类。
第 4行将交谈内容中的参数值提取出来,这表示服务程序需要知道如何理解这些参数,比如说参数类型之类的东西。(正常来说需要在交谈内容中说明这个参数的类型)。函数中剩下的就是正常的处理阶乘。在第六行,阶乘通过调用其他函数被计算出来。从 8到 12行,回复的交谈内容也被写好并且准被返回此内容。第 14行我们返回回复的交谈内容。
回复的交谈内容应该差不多是这样的:
<getFactorialResponse>
<result>720</result>
</getFactorialResponse>
同样的,客户端也可以用同样的方法处理回复的交谈内容:
$response = $client -> request ( $reqestPayloadString ) ;
$simplexml = new SimpleXMLElement ( $response -> str ) ;
echo "Result = " . $simplexml -> result [ 0 ] . "<br/>" ;
在第 3行,用回复的交谈内容创建了一个 SimpleXMLElement 实例。同样的 $response 也是一个 WSMessage的实例,我们可以访问他的成员变量 str,这个变量保存了 xml格式的回复的交谈内容。我们把它交给一个 SimpleXMLElement 构造函数,由此创建一个 SimpleXMLElement的实例。然后我们就可以访问结果元素 (或者叫节点? element, xml里面可以称之为元素,但对于树状结构的它来说,节点也不为过? )
现在你应该学会如何处理交谈信息中的内容,不管是客户端的申请也好还是服务端的回应也好。
注:在服务端的 getFactorial函数 (14行 ),你可以之间返回一个 WSmessage而不是一个回复的交谈内容。你可以用下面的这一小段程序来实现这个功能。
$outMessage = new WSMessage( $responsePayloadString );
return $outMessage ;
这其实也就是说服务端程序及可以返回 xml格式的交谈内容也可以返回 WSMessage的实例
完整的程序将在这篇文章的末尾附上。
跟踪消息
通过 WSO2 Web services framework for PHP ,你可以跟踪 SOAP消息被客户端发出,然后客户端又收到了来自服务端的消息,(即他们的交谈内容)。网络客户服务类, WSClient 有两个函数可以实现这个目的: getLastReauest()和 getLastResponse()。客户端在使用 request()这个函数以后,你可以通过这两个函数去得到交谈信息。
$response = $client -> request ( $reqestPayloadString ) ;
printf ( "<br/> Request = %s </br>" ,
htmlspecialchars ( $client -> getLastRequest ())) ;
printf ( "<br/> Response = %s </br>" ,
htmlspecialchars ( $client -> getLastResponse ())) ;
以上的程序片段会显示 request()这个函数实现的请求与回复的内容。
实际上,这段程序差不多会输出这样的东西:
Request = <soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Header/><soapenv:Body><getFactorial> <param>6</param> </getFactorial></soapenv:Body></soapenv:Envelope>
Response = <soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Header/><soapenv:Body><getFactorialResponse> <result>720</result> </getFactorialResponse></soapenv:Body></soapenv:Envelope>
跟踪 SOAP消息对于研究呼叫的服务是非常有用的,特别是对于查找服务和客户端的 bug。比如说,你可以确认所有的客户端发出的消息以及服务端回复的消息,并且,你可以确认交谈内容的格式 (客户端的以及服务端的。 )
Debugging(这个词是如此的普遍,那么我在这里就不翻译它了,尽管我的梦想是有一天程序用中文来写,显而易见的是这个梦已经离我们越来越遥远。 )
用户在使用 php WSF有时会碰到两个问题:
安装 wsf。 你怎么能确定这个 wsf已经正常工作了?好吧,第一,你可以通过 phpinfo()这个函数来检查, (要是你不知道这个函数以及怎么使用它,呃,查查 php手册吧。 ) 你只需要创建一个 php文件,并且在上面写下这几句话,然后用个浏览器打开它。
<?php
phpinfo () ;
?>
如果所有的扩展都被正确的安装的话,你会找到一个项目叫 wsf,在一个以 wsf作为标题的表里,你应当看到 'wsf support'之类的字样。这个东东是在 php.ini里定义的,(或者比如说我就没有在 php.ini 里面定义而是在 /etc/php5/conf.d/里写了一个新的文件叫做 wsf.ini,实际上这个文件夹里面所有的文件到后来都会被合并到 php.ini里,所有如果你没有在 php.ini里找到相应的设置但是你的 wsf缺能用,你不妨来这里看看。 )
如果这个扩这没有显示在 phpinfo里,那么你需要去找安装指南来好好研究一下,如果找不到可以给我发 email: ferdinandfly@yahoo.ca
当你成功的安装了以后,第二个问题就是你好像并不能让这个例子正确运行。同样的,你需要检查一些设置是否正确。 首先是 php.ini记录中,经常会设置一些日志文件的路径,也许他不存在或者是说他设定的路径 php5无法读写。还有,你应到确认 php.ini是否包含了一些脚本文件,而这些脚本文件都是可读的。
如果以上的这些都是正确的但是 wsf就是不干活,你可以查看一下日志文件。日志文件会被写到 wsf.log_path这条记录所确定的路径中。这个东东在 php.ini里进行设定。如果他没有被设定,那么 log就在 /tmp里( linux)。需要知道的是,在 windows平台中,默认的路径很可能不存在,因此你必须为他指定一个日志路径。和服务有关的日志记录在 wsf_php_server.log中,和客户端有关的保存在 wsf_php_client.log中,如果你的客户机和服务主机不是一台机器,那么这两个文件都在服务器上哦。你可以通过调节记录的等级来获得不同详细程度的日志文件。如果是调试,你可以把它设置为 level 4,当然如果是成熟的软件,你可以设置为 0(仅仅是严重错误)或者是 1(错误)。
如果你想确认来往的交谈内容( SOAP)是你所想要的格式的话,你可以用 SOAP 消息跟踪来调试,正如我们前面所讲的。
总结:
在这篇文章中,我解释了 WSMessage这个类以及怎样处理交谈内容并且使用它,客户端或者服务端都可以通过调用 str这个 WSMessage的成员变量来获得交谈内容( xml)。通常交谈内容的格式都是通过 WSDL来定义的,因此我们要求客户端和服务端需要遵守同样的格式是合理的。下一章我们会讨论如何通过 WSO2 WSF/PHP和 WSDL协同工作 .

(0)

相关推荐

  • PHP+Ajax 检测网络是否正常实例详解

    本文实例讲述了PHP+Ajax实时自动检测是否联网的方法.分享给大家供大家参考.具体实现方法如下: html部分代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xht

  • PHP判断是否连接上网络的方法

    本文实例讲述了PHP判断是否连接上网络的方法.分享给大家供大家参考.具体实现方法如下: 首先写个函数 function varify_url($url){ $check = @fopen($url,"r"); if($check){ $status = true; }else{ $status = false; } return $status; } 接着在需要的地方直接调用即可 $url = "http://www.baidu.com"; if(varify_ur

  • php实现的网络相册图片防盗链完美破解方法

    本文实例讲述了php实现的网络相册图片防盗链完美破解方法.分享给大家供大家参考.具体如下: 网络相册图片防盗链破解程序 - PHP版 这个防盗链破解版可以完美破解当下比较流行的: 百度相册,网易相册,360我喜欢等网站图片. 还可以实现简单的图片防盗链. 因为这个类是先进行获取远程图片, 然后再把图片发送到客户端,所以,算是进行了两次流量的传送.因此,会浪费空间流量,接下来,会开发缓存功能,这样可以实现节约流量! <?php /** * 网络相册图片防盗链破解程序 - PHP版 * * 使用方法

  • php保存任意网络图片到服务器的方法

    本文实例讲述了php保存任意网络图片到服务器的方法.分享给大家供大家参考.具体分析如下: 任意指定一个网络图片地址,通过这个函数下载到本地服务器 <?php function saveImage($path) { if(!preg_match('/\/([^\/]+\.[a-z]{3,4})$/i',$path,$matches)) die('Use image please'); $image_name = strToLower($matches[1]); $ch = curl_init ($

  • 谈谈新手如何学习PHP网络编程第1/2页

    文章开头就列举了那么多联系方式,难免会让大家感觉有点AD的意味,但是不容质疑的是,默默的确有那么丁点的表现欲^_^,虽然有时候过于细致会被人说婆妈,但是幸好这种细致对于编程来说,还是蛮有益的! 从默默自己向别人问怎么学PHP开始,到后来不少人又来问默默怎么学PHP,不管默默是新手,还是老鸟,似乎总是感觉摸不出一条清晰的脉络来,不过,默默既然学会了PHP,那么我走的这条路或多或少的有一定借鉴性. PHP的背景恐怕就不用默默赘言了,我相信大家选择一种语言,并不是看它的背景和悠久历史,更重要的是看它的

  • PHP的Socket网络编程入门指引

    什么是TCP/IP.UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的.          UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议.它是属于TCP/IP协议族中的一种.         这里有一张图,表明了这些协议的关系. TCP/IP协议族包括运输层.网络层.链路层.现在你知道TCP/IP与UDP的关

  • PHP中4种常用的抓取网络数据方法

    本小节的名称为 fsockopen,curl与file_get_contents,具体是探讨这三种方式进行网络数据输入输出的一些汇总.关于 fsockopen 前面已经谈了不少,下面开始转入其它.这里先简单罗列一下一些常见的抓取网络数据的一些方法. 1. 用 file_get_contents 以 get 方式获取内容: $url = 'http://localhost/test2.php'; $html = file_get_contents($url); echo $html; 2. 用fo

  • 1G网络 免费asp,php空间

    Windows 2003 操作系统:  [1] 至强高速服务器 , 高品质数据中心 , 共享 100M 带宽  [2] 实时文件防病毒保护 , 黑客入侵检测 ,IIS 应用防火墙  [3] 自动抵抗红色代码 , 尼姆达等病毒  [4] 各个网站以独立进程运行 , 不会被其他站点负载影响  [5] 功能强大控制面板 , 在线修改 FTP 密码 , 自行停止网站  [6] 自行绑定域名 , 修改网站缺省文档  [7] 免费 ACCESS ODBC 数据库 ,Access 数据库大小不受限制  [8]

  • snoopy PHP版的网络客户端提供本地下载

    magpierss中就用到了snoopy,这让我有点兴趣去研究下这个咚咚.再SF上,找到了这个源代码.居然就是一个类,但不要笑看哦,功能可是很强大的. 官方的简介,我翻译了下(汗...最近老是充当翻译的角色)    snoopy是一个php类,用来模仿web浏览器的功能,它能完成获取网页内容和发送表单的任务.     下面是它的一些特征: 1.方便抓取网页的内容 2.方便抓取网页的文字(去掉HTML代码) 3.方便抓取网页的链接 4.支持代理主机 5.支持基本的用户/密码认证模式 6.支持自定义

  • PHP 网络开发详解之远程文件包含漏洞

    以下代码(Code)实现了根据浏览器地址栏参数的文件名称包含不同文件的功能. 复制代码 代码如下: <?php $file_name = $_GET["filename"]; //获得当前文件名 include("$file_name "); //包含文件 //一些其他操作 ?> 这时,通过在地址栏上指定不同的文件名就可以实现包含不同文件并执行的功能.例如,通过在浏览器上访问http://localhost/test.php?filename=myinc

随机推荐