四种php中webservice实现的简单架构方法及实例


Posted in PHP onFebruary 03, 2015

一:PHP本身的SOAP
所有的webservice都包括服务端(server)和客户端(client)。
要使用php本身的soap首先要把该拓展安装好并且启用。下面看具体的code
首先这是服务端实现:

<?php   

class test   

{   

    function show()   

    {   

        return 'the data you request!';   

    }   

}   

function getUserInfo($name)   

{   

    return 'fbbin';   

}   

//实例化的参数手册上面有,这个是没有使用wsdl的,所以第一个参数为null,如果有使用wsdl,那么第一个参数就是这个wsdl文件的地址。   

$server = new SoapServer(null, array('uri' ='http://soap/','location'='http://localhost/test/server.php'));   

$server->setClass('test');   

//$server->addFunction('getUserInfo');   

$server->handle();   

?> 

然后是客户端

$soap = new SoapClient(null, array('location'='http://localhost/test/server.php','uri' ='http://soap/'));     

echo $soap->show();   

//得到:'the data you request!'   

//echo $soap->getUserInfo('sss'); 

就这么简单,当时这只是一个很简单的例子,其实很多的通信机制都是这么去实现的!
////////////////////////////////////////////////////////////////////////////////

二:PHPRPC
首先到官网(http://www.phprpc.org/zh_CN/ )上面去下载最新版的phprpc,解压之后会有相关的文件,我们把文件进行划分(服务端和客户端文件)如下:
服务端文件:

dhparams   

dhparams.php   

phprpc_server.php   

bigint.php   

compat.php   

phprpc_date.php   

xxtea.php 

客户端文件:

phprpc_client.php   

bigint.php   

compat.php   

phprpc_date.php   

xxtea.php 

我们把服务端文件放在服务端文件夹中,然后把客户端文件放在客户端文件夹中,之后再服务端文件夹中新建个文件(server.php)作为服务,然后再客户端新建个文件(client.php)作为客户端,各自代码如下:
server端:

<?php   

include_once"phprpc_server.php"; //加载phprpc文件   

$server = new PHPRPC_Server();   

$server->add('getUser');   

$server->setDebugMode(true);   

$server->start();   

function getUser( )   

{   

    return ‘the data you request!';   

}   

  

client端:   

[code]   

<?php   

include_once "phprpc_client.php";   

$client = new PHPRPC_Client('http://127.0.0.1/phpservice/phprpcserver/server.php');   

$data = $client->getUser();   

var_dump($data);   

//得到:the data you request! 

这上面提到wsdl之后会讲到如何生成。
////////////////////////////////////////////////////////////////////////////////

三:开源的NUSOAP
首先到网上去下载最新版的nusoap,现在的最新版本是0.9.5的,解压之后会得到一个lib文件夹,把这个文件分别放到服务端和客户端各一份,然后再服务端和客户端分别建立server.php和client.php文件,作为通信文件。
服务端文件如下:

<?php   

ini_set("soap.wsdl_cache_enabled", 0);//关闭缓存   

require_once("lib/nusoap.php"); //加载nusoap文件   

$server = new soap_server;   

$server->configureWSDL('nusoasp');//设定服务的名称,使用的wsdl来通信,如果不适用wsdl将会更简单,网上有很多的例子   

$server->register('getUserInfo', array('name'="xsd:string", 'email'="xsd:string"), array('return'="xsd:string"));   

$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';   

$server->service( $HTTP_RAW_POST_DATA );   

function getUserInfo($name, $email)   

{   

    return ‘the data you request!';   

} 

客户端文件如下:

require_once("lib/nusoap.php");   

$client = new soapclient('http://localhost/phpservice/nusoapserver/server.php?wsdl');   

$pagram = array('fbbin', 'fbbin@foxmail.com');   

$string = $client->call('getUserInfo', $pagram);   

//得到:the data you request! 

///////////////////////////////////////////////////////////////////////////////

四:HessianPHP
hessian其实我个人认为他不是一个webservice,只能说是类似而已。因为它不具备webservice的那些特性。它支持的语言比较多我们现在只需要研究php版本的HessianPHP就行了,下载最新版本是v2.0.3的,解压之后会得到一个src的目录,这个目录使我们需要使用的一个核心文件夹。
我们把名字重命名为HessianPHP然后分别分别放到server和client端,然后分别建立server.php和client.php文件。
server端:

<?php   

include_once 'HessianPHP/HessianService.php';//加载核心文件   

class TestService   

{   

    public function __construct()   

    {   

  

    }   

  

    public function add($numa, $numb)   

    {   

        return $numa + $numb;   

    }   

  

    public function check()   

    {   

        return 'fbbiin@gmail.com';   

    }   

}   

$test = new TestService();   

$hessian = new HessianService( $test, array('displayInfo' => true) );   

$hessian->handle();//注意这里不是网上的$hessian->service(),可能是版本不一样,改了吧!我也是看了源码才知道!   

?> 

client 端:

<?php   

include_once 'HessianPHP/HessianClient.php';   

$url = "http://localhost/phpservice/hessianserver/server.php";   

$options = new HessianOptions();   

$client = new HessianClient( $url, $options );   

$num = $client->add( 3, 5 );   

echo $num;//得到:8;   

echo $client->check();//得到:fbbiin@gmail.com; 

以上四种方式为web开发过程中常用到的webservice通信方式。用的最多的是nusoap,个人感觉phprpc其实也不错,这个在性能上面和nusoap基本上差不多,只不过,phprpc在商业上是收费的。还有个hessianPHP好像是用java的,采用的二进制方式传输数据流,其实也是各有千秋啊。更多的详细资料去找百度和谷歌吧。
下面说下生成wsdl文件。
我们在webservice上面进行通信用的最多的和相对来说比较安全的就是使用wsdl了,这种文件可以自己书写,但是不是一定的大牛好像写不出来啊,因此我们需要借助一个工具zend studio来生成wsdl文件。
下面我们就来生成WSDL文件了,File->New—>Other—>Web Service—>WSDL,这样就可以新建一个WSDL文件了,如图。

四种php中webservice实现的简单架构方法及实例

四种php中webservice实现的简单架构方法及实例

四种php中webservice实现的简单架构方法及实例
然后我们就来修改WSDL文件,zeng studio为我们提供了可视化的操作,当然如果你牛的话,你当然是可以改文件代码的,其实也就几个东西, 弄懂了的话也不会太难。

四种php中webservice实现的简单架构方法及实例

四种php中webservice实现的简单架构方法及实例
做完这一步,这个WSDL文件就基本可用了,但又两个问题需要注意:
做到这一步,有可能会测试失败,可能会因为没有进行binding,这个东西有时是需要手动来完成的,在binding上右键选择Generate Binding Content(就是两个大框中间那个小框)就行了。
第二个要注意的是php的WSDL缓存,在做测试时,一般要将WSDL缓存关闭,否则你使用的有可能是原来的WSDL文件,而不是更新过的。关闭缓存有两种方法,第一种就是直接到php.ini中设置soap.wsdl_cache_enabled = 0;第二种就是在php文件中添加一条语句,ini_set("soap.wsdl_cache_enabled", "0");
做到这里,你就可以放心地测试,调用你的server程序了。
说完了,OK!

PHP 相关文章推荐
PHP中在数据库中保存Checkbox数据(2)
Oct 09 PHP
php入门教程 精简版
Dec 13 PHP
(PHP实现)只使用++运算实现加法,减法,乘法,除法
Jun 27 PHP
PHP包含文件函数include、include_once、require、require_once区别总结
Apr 05 PHP
php过滤html中的其他网站链接的方法(域名白名单功能)
Apr 24 PHP
php远程下载类分享
Apr 13 PHP
php简单实现多语言切换的方法
May 09 PHP
php项目开发中用到的快速排序算法分析
Jun 25 PHP
yii2 数据库读写分离配置示例
Feb 10 PHP
php使用flock阻塞写入文件和非阻塞写入文件的实例讲解
Jul 10 PHP
ThinkPHP3.2.3框架Memcache缓存使用方法实例总结
Apr 15 PHP
laravel 修改.htaccess文件 重定向public的解决方法
Oct 12 PHP
php上传中文文件名乱码问题处理方案
Feb 03 #PHP
php上传文件常见问题总结
Feb 03 #PHP
PHP、Python和Javascript的装饰器模式对比
Feb 03 #PHP
php对象在内存中的存在形式分析
Feb 03 #PHP
浅析THINKPHP的addAll支持的最大数据量
Feb 03 #PHP
php格式化金额函数分享
Feb 02 #PHP
php可应用于面包屑导航的迭代寻找家谱树实现方法
Feb 02 #PHP
You might like
浅谈PHP语法(1)
2006/10/09 PHP
PHP生成UTF8文件的方法
2010/05/15 PHP
详解PHP实现异步调用的4种方法
2016/03/14 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
2017/06/06 PHP
thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
2019/05/29 PHP
基于逻辑运算的简单权限系统(实现) JS 版
2007/03/24 Javascript
javascript innerHTML、outerHTML、innerText、outerText的区别
2008/11/24 Javascript
Ruffy javascript 学习笔记
2009/11/30 Javascript
javascript 同时在IE和FireFox获取KeyCode的代码
2010/02/07 Javascript
js的匿名函数使用介绍
2013/12/11 Javascript
jquery跨域请求示例分享(jquery发送ajax请求)
2014/03/25 Javascript
基于Bootstrap+jQuery.validate实现Form表单验证
2014/12/16 Javascript
javascript操作数组详解
2014/12/17 Javascript
JSON与String互转的实现方法(Javascript)
2016/09/27 Javascript
AngularJS实现用户登录状态判断的方法(Model添加拦截过滤器,路由增加限制)
2016/12/12 Javascript
Spring Boot+AngularJS+BootStrap实现进度条示例代码
2017/03/02 Javascript
JS实现列表页面隔行变色效果
2017/03/25 Javascript
JS+HTML5 FileReader对象用法示例
2017/04/07 Javascript
关于jQuery.ajax()的jsonp碰上post详解
2017/07/02 jQuery
Vue2路由动画效果的实现代码
2017/07/10 Javascript
JS实现的抛物线运动效果示例
2018/01/30 Javascript
处理JavaScript值为undefined的7个小技巧
2020/07/28 Javascript
Python错误提示:[Errno 24] Too many open files的分析与解决
2017/02/16 Python
Python多进程与服务器并发原理及用法实例分析
2018/08/21 Python
Python multiprocessing多进程原理与应用示例
2019/02/28 Python
对Python 中矩阵或者数组相减的法则详解
2019/08/26 Python
python SocketServer源码深入解读
2019/09/17 Python
浅析Python+OpenCV使用摄像头追踪人脸面部血液变化实现脉搏评估
2019/10/17 Python
python3实现名片管理系统(控制台版)
2020/11/29 Python
德国体育用品网上商店:SC24.com
2016/08/01 全球购物
英国电子专家:maplin
2019/09/04 全球购物
什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
2012/05/23 面试题
优秀老师事迹材料
2014/02/05 职场文书
《盲人摸象》教学反思
2014/02/16 职场文书
四十年同学聚会致辞
2015/07/28 职场文书
详解CSS中的特指度和层叠问题
2021/07/15 HTML / CSS