在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>
<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的报道非常多,让我们密切关注它们的发展吧!
文章整理:西部数码
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP 애플리케이션에서는 현재 날짜를 파일 이름으로 사용하여 파일을 저장하거나 업로드해야 하는 경우가 있습니다. 날짜를 수동으로 입력하는 것도 가능하지만, 현재 날짜를 파일명으로 사용하는 것이 더 편리하고, 빠르고, 정확합니다. PHP에서는 date() 함수를 사용하여 현재 날짜를 가져올 수 있습니다. 이 함수의 사용 방법은 다음과 같습니다. date(format, timestamp); 여기서 format은 날짜 형식 문자열이고 timestamp는 날짜와 시간을 나타내는 타임스탬프입니다. 이 매개변수가 전달되지 않으면 이 매개변수가 사용됩니다.

튜토리얼: Firebase 클라우드 메시징을 사용하여 PHP 애플리케이션에서 예약된 메시지 푸시 기능 구현 개요 FCM(Firebase 클라우드 메시징)은 개발자가 Android, iOS 및 웹 애플리케이션에 실시간 메시지를 보내는 데 도움이 되는 Google에서 제공하는 무료 메시지 푸시 서비스입니다. 이 튜토리얼에서는 FCM을 사용하여 PHP 애플리케이션을 통해 예약된 메시지 푸시 기능을 구현하는 방법을 안내합니다. 1단계: 먼저 F에서 Firebase 프로젝트 만들기

1. 일반 프로그래밍이란 무엇입니까? 일반 프로그래밍이란 공통 데이터 유형을 프로그래밍 언어로 구현하여 이 데이터 유형을 다른 데이터 유형에 적용하여 코드 재사용 및 효율성을 달성하는 것을 말합니다. PHP는 동적 유형 지정 언어입니다. C++, Java 및 기타 언어와 같은 강력한 유형 메커니즘이 없으므로 PHP에서 일반 프로그래밍을 구현하는 것은 쉽지 않습니다. 2. PHP의 일반 프로그래밍 PHP에서 일반 프로그래밍을 구현하는 방법에는 인터페이스를 사용하는 방법과 특성을 사용하는 방법이 있습니다. 인터페이스를 사용하여 PHP에서 인터페이스 만들기

Redis는 문자열, 해시 테이블, 목록, 집합, 순서 집합 등을 포함한 다양한 데이터 구조를 지원하는 고성능 키-값 스토리지 시스템입니다. 동시에 Redis는 문자열 데이터에 대한 정규식 일치 및 대체 작업도 지원하므로 PHP 애플리케이션 개발 시 매우 유연하고 편리합니다. PHP 애플리케이션에서 정규식 작업에 Redis를 사용하려면 먼저 phpredis 확장을 설치해야 합니다. 이 확장은 Redis 서버와 통신하는 방법을 제공합니다.

PHP의 서명 인증 방법 및 응용 인터넷의 발달과 함께 웹 응용 프로그램의 보안이 점점 더 중요해지고 있습니다. 서명 인증은 요청의 적법성을 확인하고 무단 액세스를 방지하는 데 사용되는 일반적인 보안 메커니즘입니다. 이 기사에서는 PHP의 서명 인증 방법과 해당 응용 프로그램을 소개하고 코드 예제를 제공합니다. 1. 서명인증이란 무엇인가요? 서명 인증은 키와 알고리즘을 기반으로 하는 확인 메커니즘입니다. 요청 매개변수는 고유한 서명 값을 생성하기 위해 암호화됩니다. 그런 다음 서버는 요청을 해독하고 동일한 알고리즘과 키를 사용하여 서명을 확인합니다.

가장 널리 사용되는 서버 측 스크립팅 언어 중 하나인 PHP는 기업 수준 웹 사이트 개발에 널리 사용됩니다. 유연성, 확장성 및 사용 용이성으로 인해 PHP는 엔터프라이즈 수준 웹 사이트 개발에 가장 적합한 언어입니다. 이 기사에서는 엔터프라이즈 수준 웹 사이트 개발에서 PHP를 적용하는 방법에 대해 설명합니다. 우선, PHP는 기업 수준의 웹사이트 개발에 핵심적인 역할을 합니다. 사용자 인증, 데이터 저장, 데이터 분석 및 보고서 생성 등 다양한 기능을 구축하는 데 사용할 수 있습니다. PHP는 데이터베이스와 원활하게 통합될 수 있으며 주류 데이터를 지원합니다.

튜토리얼: Baidu Cloud Push(BaiduPush) 확장을 사용하여 PHP 애플리케이션에서 메시지 푸시 기능 구현 소개: 모바일 애플리케이션이 급속히 발전함에 따라 애플리케이션에서 메시지 푸시 기능이 점점 더 중요해지고 있습니다. 즉각적인 알림 및 메시지 푸시 기능을 구현하기 위해 Baidu는 Baidu Cloud Push(BaiduPush)라는 강력한 클라우드 푸시 서비스를 제공합니다. 이 튜토리얼에서는 Baidu Cloud Push Extension(PHPSDK)을 사용하여 PHP 애플리케이션에서 메시지 푸시 기능을 구현하는 방법을 알아봅니다. Baidu 클라우드를 사용하겠습니다.

PHP 애플리케이션의 Redis 작업 로그 PHP 애플리케이션에서는 데이터 캐싱 또는 저장을 위한 솔루션으로 Redis를 사용하는 것이 점점 더 일반화되었습니다. Redis는 빠르고 확장 가능하며 가용성이 뛰어나고 다양한 데이터 구조를 갖춘 고성능 키-값 스토리지 데이터베이스입니다. Redis를 사용할 때 애플리케이션 작동을 더 잘 이해하고 데이터 보안을 위해 Redis 작업 로그가 필요합니다. Redis 작업 로그는 Redis 서버의 모든 클라이언트를 기록할 수 있습니다.
