标签:
越来越多的架构偏向于面向接口和面向服务的设计了,当我们把抽象的落地变为实际的时候,我们感觉到了代码的厚度。而当我们把具体的业务再进一步抽象,我们就能发现藏在细节深处的回馈。
php可以提供service,利用一些契约(或者说协议)来进行通信和交换数据。常用的有soap,rpc,restful api(json传输为主流)等方式。我在jm的时候,曾经用过thrift写的接口,给java组的童鞋提供数据接口。thirift让不同编程语言的项目可以很好协调在一起,形成的文档也较为清晰,但是毕竟又借用了三方的东西,增加维护成本和学习成本。
关于restful api,我是非常喜欢的。基于资源的设计,清晰无比的请求方式(get,put,post,del),加上json友好的格式化数据传递,有点大道至简的禅味。我手里正在做的一个私人项目,就是基于这种方式写的。restful api要聊的太多了,不过不是我今天要谈的,还是聊聊 soap吧。
简单说,soap是基于XML的交换数据的协议。因为是xml映射数据关系,所以不在乎是什么编程语言或者平台(其实我更喜欢json方式,更纯粹)。
php在实现soap的方式有两种,一种是wsdl方式,一种是无wsdl方式。今天我只谈wsdl方式。
实现原理如我整理之图所示:
soap分为server端和client端,server端运行起来之后一直handle,然后client端利用生成好的wsdl文件规则,去注册使用server端的接口,获取返回数据(xml之类的).
类比java中的socket编程,也是client去监听server,server一直阻塞等待调用。
代码如下。
server parts:
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2015/12/3 * Time: 16:44 */ class Server { /** * 获取用户列表 * * @return mixed * @author freephp at 2015-12-3 */ function userList() { $data = $this->user_model->find(); return $data; } /** * 获取派对列表 * * @return array * @author freephp at 2015-12-3 */ function partyList() { // some codes to do return array( ‘party_name‘ => ‘cn‘, ‘history‘ => 1995 ); } } try { $soap = new SoapServer("server.wsdl"); // new一个SoapServer对象出来,此为php标准库里对象 } catch (Exception $e) { echo $e->getMessage();die(); } //This uri is your SERVER ip. $soap->setClass("Server"); $soap->handle(); // handle it
client端代码如下:
<?php /**
* client调用.加了很多调试try,catch.
**/ try { $client = new SoapClient(null, array( ‘location‘ => self::$serverUrl, ‘uri‘ => self::$uri, ) ); } catch (Exception $e) { // print the error info echo $e->getMessage(); die(); } try { $data = $client->useList(self::$verifyID, $xml); } catch (SoapFault $ex) { // 调试打印出错误堆栈和最后一次请求信息 print $ex->getMessage(); print $ex->getTraceAsString(); echo $client->__getLastResponse(); echo $client->__getLastResponseHeaders(); die(); }
标签:
原文地址:http://www.cnblogs.com/freephp/p/5016929.html