cari
Rumahpembangunan bahagian belakangtutorial php在PHP中利用XML技术构造远程服务(转)-PHP教程,PHP应用

在php中利用xml技术构造远程服务

未来的web将是以服务为中心的web,xml_rpc标准使得编写和应用服务变得非常简单。本文介绍xml_rpc标准及其php实现,并通过实例示范了如何在php中开发xml_rpc服务和客户程序。

一、服务式web
从内容提供商所采用的简单方法到uddi(universal description,discovery and integration)的未来构想,业界已经有大量关于“服务式web”的说明和评论。就web的初创阶段来说,它只是一个文档的集散地,提供的只是一些可浏览的信息。随着web的发展,在web上运行服务越来越具有吸引力。未来,web将成为企业为客户和其他企业提供便捷服务的载体。b2b和b2c模式间的协同就可以看成是一种服务式web。

一个很重要的问题是,web上究竟可以提供哪些服务?web能够提供的服务非常多,其中有些服务现在已经在使用,有些服务在不久的将来就会出现。为了说明问题,下面列出了一小部分可以通过web提供的服务:

面向主题的垂直搜索引擎。
供用户查找信息的知识库。
用户可以请教问题的专家系统。
银行服务。
新闻和信息出版服务。
数字化支付相关的服务。
图形处理服务。
卫生和健康服务。

那么,企业和组织通过web提供服务的正确途径是什么呢?这是一个很重要的问题。今天,有些服务提供html界面,它们通过文档的形式提供服务,但在服务界面的背后隐藏着什么?在占领web的竞赛中,web浏览器并不孤单,移动电话、手持设备以及微波炉之类的设备都想要访问web、查询数据库、转换数据、提取信息,等等。要实现真正的服务式web,在表现层(html)之下应该还有另外一层。

二、xml_rpc标准
xml或许是近10年来最为重要的标准,xml词汇表(vocabulary)为企业构造服务环境提供了基石。要构建服务式web就有必要学习xml_rpc标准,这不仅是因为xml_rpc对于把服务放到web上很有用,而且因为xml_rpc是一种已经成形的、很容易采用的标准。对于b2b服务来说,提供服务的标准是极其重要的,共同遵循标准的公司可以利用其它公司提供的服务获得快速的增长。无法想象在各种私有的服务标准之上可以建立起真正的服务式web,服务必须有一种可以遵循的标准。

xml_rpc是一种面向internet分布式处理的标准。rpc即为remote procedure call(远程过程调用)的缩写,它是一种远程调用机制,用于调用可能驻留在其他机器之上以及可能用其他语言编写的过程。远程过程调用是分布式计算的重要支柱。例如,在一个分布式计算环境中,我们可以寻找和利用在其他机器上运行的执行加法和减法操作的过程,执行加法操作的过程可能用apl编写、在rs6000机器上运行,执行减法操作的过程可能用c编写、在unix上运行。其他要使用这种分布式计算器的开发者同样可以利用它们,或者他也可以选用另外更好的计算器。

在rpc中,过程(procedure)是最主要的构件,服务器提供的就是供客户端调用的过程。过程可以接收参数并返回结果。xml_rpc以http作为协议载体,通过发送和接收数据的xml词汇表实现rpc机制。xml_rpc服务器接收xml_rpc请求并返回xml_rpc应答,xml_rpc客户程序发送xml_rpc请求并接收xml_rpc应答。服务器和客户必须按照xml_rpc标准的要求处理应答和请求。

三、xml_rpc协议
完整的xml_rpc规范可以在http://www.xmlrpc.com/spec找到。下面是其要点说明。

3.1 xml_rpc请求

xml_rpc请求应该是http post请求,它的正文是xml格式。请求的xml部分格式如下:

<?xml version="1.0" ?>
<methodcall>
<methodname>examples.getstatename</methodname>
<params>
<param>
<value><i4>41</i4></value>
</param>
</params>
</methodcall>


指定数据发送到哪里的url并未在这里指定。如果服务器专门用来进行rpc处理,它可能是“/”。上述xml文档中的有效载荷是一个“methodcall”结构。methodcall必须包含一个“methodname”子元素,“methodname”子元素包含一个描述待调用方法的字符串。如何解释“methodname”的内容完全由服务器决定,例如它可以是一个执行文件的名字,可以是数据库中记录的名字,或者任何其他东西。如果过程接收参数,“methodcall”可以包含一个“params”元素以及若干个“param”子元素。每一个“param”元素包含一个带有类型描述符的值,类型描述符如下表所示:


标记 说明
<i4>或<int> 四字节的带符号整数,如12
<boolean> 0(false),或1(true)
<string> 字符串,如“hello world”
<double> 双精度带符号浮点数,如-12.214
<datetime.iso8601> 日期/时间,如19980717t14:08:55
<base64> base64编码的二进制数据,如ew91igbid0ihjlqgdghpcye


3.1.1 结构

值可以是一个结构,结构用元素描述。每个包含多个,每个包含一个和一个。下面是一个由两个元素构成的结构:

<struct>
<member>
<name>name</name>
<value><string>member1</string></value>
</member>
<member>
<name>member2</name>
<value><i4>19</i4></value>
</member>
</struct>


可以嵌套,任意可以包含或者任意其它类型,包括

3.1.2 数组

值可以是数组类型,数组用元素描述。每个元素包含一个元素,元素里面可以包含任意多个元素。下面是数组元素的一个例子:

<array>
<data>
<value><boolean>0</boolean></value>
<value><i4>9</i4></value>
<value><string>hello</string></value>
</data>
</array>


元素没有名字。如前例所示,元素的值可以是各种类型。元素可以嵌套,任何都可以包含或者其他类型,如上面介绍的

3.2 xml_rpc应答

xml_rpc应答是一个http应答,内容类型是text/xml。应答正文的格式如下:

<?xml version="1.0"?>
<methodresponse>
<params>
<param>
<value><string>abcdefg</string></value>
</param>
</params>
</methodresponse>


可能包含一个结构,或者可能包含一个结构,具体由过程调用是否成功决定。结构与xml请求中的一样,元素的语法如下:

<fault>
<value>
<struct>
<member>
<name>faultcode</name>
<value><int>4</int></value>
</member>
<member>
<name>faultstring</name>
<value><string>error!</string></value>
</member>
</struct>
</value>
</fault>


四、基于xml_rpc的web服务
利用xml_rpc构造和使用服务是很方便的。企业为自己提供的各种服务部署xml_rpc服务器,用户、客户软件和客户企业就可以使用这种服务构造出高端服务或者面向最终用户的应用。这种提供更有效、廉价和优质服务的竞争将极大地提高应用服务的质量。

但这里还存在一些问题有待解决,例如怎样编目、索引、搜索web上的服务?uddi试图解决这个问题,不过这个标准并不简单,而且业界对它的反应也尚未明了。然而,在企业内部应用xml_rpc不仅能够改善代码的可重用性,而且还会带来一种全新的分布式计算模式,在此后的数年中它必将成为一种重要的知识财富。xml_rpc的发展从解决分布式计算问题以及成为服务式web的基本层面开始,从而获得了一个非常好的开端,其后必将紧随着人们对该标准的热衷。既然如此,现在就让我们来看看xml_rpc的实际应用吧!

4.1 在php中应用xml_rpc

对于提供web服务来说,php是一种非常理想的语言。我们只需编写好php代码然而把它放到一个合适的位置,就立即有了一个可通过url“调用”的服务。php中的xml_rpc实现可能复杂也可能简单,但我们拥有许多种选择。这里我们选用的是来自useful information company的xml_rpc实现,它的代码和文档可以从http://xmlrpc.usefulinc.com/下载。

这个xml_rpc实现的基本类涉及两个文件:

xmlrpc.inc:包含xml_rpc的php客户端所需要的类

xmlrpcs.inc:包含xml_rpc的php服务器所需要的类

4.2 客户端

编写xml_rpc客户端意味着:

1.创建一个xml_rpc请求消息

2.设置xml_rpc参数

3.创建一个xml_rpc消息

4.发送消息

5.获得应答

6.解释应答

请看下面这个例子:

<?php
$f=new xmlrpcmsg(examples.getstatename,array(new xmlrpcval(14, "int")));
$c=new xmlrpc_client("/rpc2", "betty.userland.com", 80);
$r=$c->send($f);
$v=$r->value();
if (!$r->faultcode()) {
print "状态代码". $http_post_vars["stateno"] . "是" .
$v->scalarval() . "<br>";
print "<hr>这是服务器的应答<br><pre>" .
htmlentities($r->serialize()). "</pre><hr>\n";
} else {
print "错误: ";
print "代码: " . $r->faultcode() .
" 原因: " .$r->faultstring()."<br>";
}
?>


在这个例子中,我们先创建了一个调用“examples.getstatename”方法的xml_rpc消息,并传递了一个类型为“int”值为14的整数参数。然后,我们创建了一个描述待调用url(路径、域和端口)的客户。接着,我们发送了消息,接收应答对象并检查错误。如果不存在错误,我们就显示结果。

编写rpc客户程序时要用到的主要函数如下:

创建客户用:

$client=new xmlrpc_client($server_path, $server_hostname, $server_port);

发送消息的方法是:

$response=$client->send($xmlrpc_message);

它返回的是xmlrpcresp的一个实例。我们所传递的消息是xmlrpcmsg的实例,它用如下方法创建:

$msg=new xmlrpcmsg($methodname, $parameterarray);

methodname是待调用的方法(过程)的名字,parameterarray是xmlrpcval对象的php数组。例如:

$msg=new xmlrpcmsg("examples.getstatename", array(new xmlrpcval(23, "int")));

xmlrpcval对象可以用如下形式创建:

<?php
$myval=new xmlrpcval($stringval);
$myval=new xmlrpcval($scalarval, "int" | "boolean" | "string" | "double" | "datetime.iso8601" | "base64");
$myval=new xmlrpcval($arrayval, "array" | "struct");
?>


第一种形式创建的是xmlrpc字符串值。第二种形式创建的是描述值和类型的值。第三种形式通过在数组之类的结构中组合其他xmlrpc值创建复杂的对象,例如:

<?php
$myarray=new xmlrpcval(array(new xmlrpcval("tom"), new xmlrpcval("dick"),new xmlrpcval("harry")), "array");
$mystruct=new xmlrpcval(array(
"name" => new xmlrpcval("tom"),
"age" => new xmlrpcval(34, "int"),
"geek" => new xmlrpcval(1, "boolean")),"struct");
?>


应答对象是xmlrpcresp类型,通过调用客户对象的send方法获得。在服务器端,我们可以通过如下方式创建xmlrpcresp类型的对象:

$resp=new xmlrpcresp($xmlrpcval);

而在客户端,则使用如下方法从应答获取xmlrpcval:

$xmlrpcval=$resp->value();

接下来我们就可以用下面这种方式获取描述应答结果的php变量:

$scalarval=$val->scalarval();

对于复杂的数据类型,有两个函数非常有用,这两个函数都在xmlrpc.inc内:

$arr=xmlrpc_decode($xmlrpc_val);

该函数返回一个php数组,其中包含了xmlrpcval变量$xmlrpc_val之内的数据,这些数据已经被转换成php本身具有的变量类型。

$xmlrpc_val=xmlrpc_encode($phpval);

该函数返回一个xmlrpcval类型的值,其中包含了$phpval描述的php数据。对于数组和结构,此方法能够进行递归分析。注意,这里不存在对非基本数据类型(如base-64数据,或者日期-时间数据)的支持。

4.3 服务器端

利用xmlrpcs.inc提供的类编写服务非常简单。要创建一个服务,我们按照如下方式创建xmlrpc_server的实例:

<?php
$s=new xmlrpc_server( array("examples.myfunc" =>
array("function" => "foo")));
?>

传递给xmlrpc_server构造函数的是一个联合数组的联合数组。过程“examples.myfunc”调用“foo”函数,由于这个原因foo被称为方法句柄。

编写方法句柄很简单。下面是一个方法句柄的骨架:

<?php
function foo ($params) {
global $xmlrpcerruser; // 引入用户错误代码值
// $params是一个xmlrpcval对象的数组
if ($err) {
// 错误条件
return new xmlrpcresp(0, $xmlrpcerruser+1, // 用户错误1
"error!");
} else {
// 成功
return new xmlrpcresp(new xmlrpcval("fine!", "string"));
}
}
?>


可以看到,程序检查了错误,如存在错误则返回错误(从$xmlrpcerruser+1开始);否则如果一切正常,则返回描述操作成功信息的xmlrpcresp。

五、应用实例
在下面这个例子中我们将构造一个服务。对于给定的数值n,服务返回n*2。客户端利用该服务计算5*2的值。

服务器端的代码如下:

<?php
include("xmlrpc.inc");
include("xmlrpcs.inc");
function foo ($params)
{
global $xmlrpcerruser; // 引入用户错误代码值
// $params是xmlrpcval对象的一个数组
$vala=$params->params[0];
$sval=$vala->scalarval();
$ret=$sval*2;
return new xmlrpcresp(new xmlrpcval($ret, "int"));
}
$s=new xmlrpc_server( array("product" =>
array("function" => "foo")));
?>


客户端代码如下:

<?php
include("xmlrpc.inc");
if ($http_post_vars["number"]!="") {
$f=new xmlrpcmsg(product,array(new xmlrpcval($http_post_vars["number"], "int")));
$c=new xmlrpc_client("/xmlrpc/servfoo.php", "luigi.melpomenia.com.ar", 80);
$c->setdebug(0);
$r=$c->send($f);
$v=$r->value();
if (!$r->faultcode()) {
print "number ". $http_post_vars["number"] . " is " .
$v->scalarval() . "<br>";
print "<hr>来自服务器的结果!<br><pre>" .
htmlentities($r->serialize()). "</pre><hr>\n";
} else {
print "操作失败: ";
print "代码: " . $r->faultcode() .
" 原因: " .$r->faultstring()."<br>";
}
}
print "<form method=\"post\">
<input name=\"number\" value=\"${number}\">
<input type=\"submit\" value=\"go\" name=\"submit\"></form><p>
输入一个数值";
?>


结束语:xml_rpc服务的运作还涉及其他许多基础设施和基础工作,如分布式过程的编目和索引机制,又如在编程语言中处理xml_rpc的更好接口等。有关xml_rpc和服务式web的报道非常多,让我们密切关注它们的发展吧!
文章整理:西部数码

以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
PHP应用:使用当前日期作为文件名PHP应用:使用当前日期作为文件名Jun 20, 2023 am 09:33 AM

在PHP应用中,我们有时需要使用当前日期作为文件名来保存或上传文件。虽然可以手动输入日期,但使用当前日期作为文件名可以更方便、快捷和准确。在PHP中,我们可以使用date()函数来获取当前日期。该函数的使用方法为:date(format,timestamp);其中,format为日期格式字符串,timestamp为表示日期和时间的时间戳,不传递该参数将使用

教程:使用Firebase Cloud Messaging在PHP应用中实现定时消息推送功能教程:使用Firebase Cloud Messaging在PHP应用中实现定时消息推送功能Jul 25, 2023 am 11:21 AM

教程:使用FirebaseCloudMessaging在PHP应用中实现定时消息推送功能概述FirebaseCloudMessaging(FCM)是谷歌提供的一种免费的消息推送服务,它能够帮助开发者向Android、iOS和Web应用发送实时消息。本教程将带领大家通过PHP应用使用FCM实现定时消息推送功能。步骤一:创建Firebase项目首先,在F

PHP中的泛型编程及其应用PHP中的泛型编程及其应用Jun 22, 2023 pm 08:07 PM

一、什么是泛型编程泛型编程是指在编程语言中实现一种通用的数据类型,使得这种数据类型能够适用于不同的数据类型,从而实现代码的复用和高效。PHP是一种动态类型语言,不像C++、Java等语言有强类型机制,因此在PHP中实现泛型编程不是一件容易的事情。二、PHP中的泛型编程方式PHP中有两种方式实现泛型编程:分别是使用接口和使用Trait。使用接口在PHP中创建一

Redis在PHP应用中的正则表达式操作Redis在PHP应用中的正则表达式操作May 16, 2023 pm 05:31 PM

Redis是一个高性能的key-value存储系统,它支持多种数据结构,其中包括字符串、哈希表、列表、集合、有序集合等。同时,Redis也支持对字符串数据进行正则表达式的匹配和替换操作,这使得它在开发PHP应用中具有很大的灵活性和便捷性。在PHP应用中使用Redis进行正则表达式操作,需要先安装好phpredis扩展,该扩展提供了与Redis服务器进行通信的

Redis在PHP应用中的操作日志Redis在PHP应用中的操作日志May 15, 2023 pm 08:10 PM

Redis在PHP应用中的操作日志在PHP应用中,使用Redis作为缓存或存储数据的方案已经变得越来越普遍了。Redis是一种高性能的键值存储数据库,具有快速、可扩展、高可用、数据结构多样等特点。在使用Redis时,为了更好地了解应用程序的运行情况,同时为了数据的安全性,我们需要有一份Redis操作日志。Redis操作日志能够记录Redis服务器上所有客户端

Redis在PHP应用中的全文搜索Redis在PHP应用中的全文搜索May 19, 2023 am 08:01 AM

随着互联网技术的不断发展,搜索引擎的应用越来越广泛。在互联网的背景下,搜索引擎已成为用户获取信息的主要途径之一。而在此过程中,全文搜索技术起到了至关重要的作用。全文搜索通过对文本内容的建立索引,在用户查询时快速定位到匹配的文本。在PHP应用中实现全文搜索,有很多的方案,而本文将重点介绍Redis在PHP应用中的全文搜索。Redis是一个高性能的非关系型内存

在PHP应用中根据业务逻辑使用APC缓存技术在PHP应用中根据业务逻辑使用APC缓存技术Jun 20, 2023 am 11:51 AM

在PHP应用中,缓存技术是提高应用性能的重要手段之一。其中APC(AlternativePHPCache)缓存技术是PHP开发中比较常用的一种技术,可用于加快PHP应用程序页面的加载速度。在本文中,我们将讨论如何根据业务逻辑使用APC缓存技术,以改善PHP应用程序的性能。一、什么是APC缓存技术?APC是一种PHP扩展程序,它以缓存机制来加速PHP脚

Redis在PHP应用中的Bitmap操作Redis在PHP应用中的Bitmap操作May 19, 2023 am 08:10 AM

在Web开发领域,Redis是一个非常流行的键值存储数据库,而PHP是一种广泛使用的Web编程语言。Redis提供了许多功能,其中一个非常有用的功能是Bitmap操作。Bitmap是Redis中的一种数据结构,它可以轻松地实现各种位图操作。本文旨在介绍Redis中的Bitmap操作,并演示如何在PHP中使用这些操作。什么是Bitmap?Bitmap是一种数据

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SecLists

SecLists

SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

Pelayar Peperiksaan Selamat

Pelayar Peperiksaan Selamat

Pelayar Peperiksaan Selamat ialah persekitaran pelayar selamat untuk mengambil peperiksaan dalam talian dengan selamat. Perisian ini menukar mana-mana komputer menjadi stesen kerja yang selamat. Ia mengawal akses kepada mana-mana utiliti dan menghalang pelajar daripada menggunakan sumber yang tidak dibenarkan.

EditPlus versi Cina retak

EditPlus versi Cina retak

Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod

mPDF

mPDF

mPDF ialah perpustakaan PHP yang boleh menjana fail PDF daripada HTML yang dikodkan UTF-8. Pengarang asal, Ian Back, menulis mPDF untuk mengeluarkan fail PDF "dengan cepat" dari tapak webnya dan mengendalikan bahasa yang berbeza. Ia lebih perlahan dan menghasilkan fail yang lebih besar apabila menggunakan fon Unicode daripada skrip asal seperti HTML2FPDF, tetapi menyokong gaya CSS dsb. dan mempunyai banyak peningkatan. Menyokong hampir semua bahasa, termasuk RTL (Arab dan Ibrani) dan CJK (Cina, Jepun dan Korea). Menyokong elemen peringkat blok bersarang (seperti P, DIV),