2024年PHP日本大会

XML-RPC 函数

目录

添加注释

用户贡献注释 19条注释

3
astrolox at lawyersonline dot co dot uk
19年前
SourceForge上的PHP XML-RPC项目使生活轻松得多。但是,该项目使用一些与XML-RPC扩展提供的函数名称相同的函数名称。

如果您在服务器上编译了XML-RPC扩展,但希望使用基于PHP的版本,则必须重命名一些函数。

我注意到sourceforge表示2005年该项目有活动,但最后一个版本是2003年1月12日。

我建议您尽可能使用这个不太友好的PHP扩展。但是,如果您无法控制服务器上可用的扩展,那么这个sourceforge项目仍然是一个好主意。

http://phpxmlrpc.sourceforge.net/
3
swunderlin at REMOVE-telemedia dot ch
20年前
如果您无法重新编译PHP,pear有一个XML_RPC包
http://pear.php.net/package/XML_RPC
3
steve at orangeNOSPAMimagineering dot com
22年前
Keith Devens有一个方便的库(版本2.2.1)位于
http://www.keithdevens.com/software/xmlrpc/

这是一个示例客户端。它远程调用sample.sumAndDifference
带有两个参数(3和5)。
它返回

sum => 8
difference => -2

<?php
include ("kd_xmlrpc.php");
// define("XMLRPC_DEBUG", 0); // 设置为1以方便调试

$method = "sample.sumAndDifference";
$params = XMLRPC_prepare(array(3,5));

$site = "xmlrpc-c.sourceforge.net";
$location = "/api/sample.php";

list(
$success, $result) = XMLRPC_request( $site, $location, $method, $params );

// XMLRPC_debug_print(); // 取消注释以进行调试

foreach ( $result as $key => $value ) {
echo(
" $key => $value \n");
}

?>
10
martin dot rode at programmfabrik dot de
19年前
要连接到python xmlrpc服务器,我使用

function do_call($host, $port, $request) {

$url = "http://$host:$port/";
$header[] = "Content-type: text/xml";
$header[] = "Content-length: ".strlen($request);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);

$data = curl_exec($ch);
if (curl_errno($ch)) {
print curl_error($ch);
} else {
curl_close($ch);
return $data;
}
}

$request = xmlrpc_encode_request('add', array(3, 4));
$response = do_call($host, $port, $request);
3
keithNO dot SPAMthornhill at gmail dot com
18年前
对于尝试同样操作的其他人,如果您想从客户端发送base64编码的文件,然后将其保存到服务器上,则函数的外观如下所示。其他评论中提供了通过RPC调用此函数所需的代码,所以我不会重复。

参数
1 - 文件名
2 - 文件的base64编码数据

注意$file_data->scalar的使用

<?
function sendFile($method_name, $params, $user_data) {
$file = "/somedir/" . $params[0];
$file_data = $params[1];

$fh = @fopen($file, "wb");
if ($fh) {
if (@fwrite($fh, $file_data->scalar)) {
$msg = "成功消息";
} else {
$msg = "无法写入文件";
}
fclose($fh);
return $msg;
} else {
return "无法打开文件";
}
}
?>
2
php at hendrik-krauss dot de
20年前
关于“datetime”值

如果您使用这些函数实现XML-RPC服务器,并且客户端在您的服务器上调用方法,并发送datetime作为参数(以ISO 8601格式,如http://www.xmlrpc.com/spec中指定),则PHP XML-RPC将作为参数传递给您注册的服务器方法一个对象。例如,该对象如下所示:
obj->type="datetime"
obj->scalar="20040420T13:32:40"
obj->timestamp=1082460760

如果您执行xmlrpc_get_type(obj),它将返回“datetime”,因此该函数大概只返回'type'的值。'scalar'似乎是datetime的线上传输表示(ISO 8601,与接收到的完全相同)。'timestamp'似乎是'scalar'中ISO值转换为正常的PHP时间戳(即Unix time_t)。

关于'scalar'的说明:使用MySQL数据库,我们执行了类似“select blah where start_time >= $obj->scalar ;”的操作。这实际上有效并返回了预期的结果,因此MySQL似乎正确处理了该ISO 8601格式。
1
digibrisk at gmail dot NOSPAM dot SPAMNO dot com
17年前
补充giunta dot gaetano at sea-aeroportimilano dot it和astrolox at lawyersonline dot co dot uk关于Sourceforge PHP XML-RPC项目所说的内容:您可以使用function_exists()来确定扩展是否已安装,这样您就不必产生性能开销。如果它没有安装,则该函数将不存在,并且function_exists()返回false。在这种情况下,您可以回退到替代库。例如

<?php

if(!function_exists("xmlrpc_server_create")) {
// 包含必要的文 件。
}

?>
3
steph at zend dot com
20年前
我花了些时间才用无外部库的方式搭建了一个客户端。这个非常基础的客户端/服务器对在我的家庭环境下运行良好——希望它能为下一个 XML-RPC 新手省去一些麻烦。

/* clienttest.php */
<?php
function do_call($host, $port, $request) {

$fp = fsockopen($host, $port, $errno, $errstr);
$query = "POST /home/servertest.php HTTP/1.0\nUser_Agent: My Egg Client\nHost: ".$host."\nContent-Type: text/xml\nContent-Length: ".strlen($request)."\n\n".$request."\n";

if (!
fputs($fp, $query, strlen($query))) {
$errstr = "写入错误";
return
0;
}

$contents = '';
while (!
feof($fp)) {
$contents .= fgets($fp);
}

fclose($fp);
return
$contents;
}

$host = 'localhost';
$port = 80;
$request = xmlrpc_encode_request('cycle', 'egg');
$response = do_call($host, $port, $request);
/* 对 $response 进行处理,例如打印它 */
?>

/* servertest.php */
<?php
function lifecycle($method, $params) {
/* $method = 'cycle', $params = (数组)请求参数; 如果我们有数据传递,$data 也从 xmlrpc_server_call_method 传递 */
switch($params[0]) {
case
'egg':
$reply = '所有蛋总有一天都会变成鸟。';
break;
default:
$reply = '那一定是个其他的蛋';
}
return
$reply;
}

$server = xmlrpc_server_create();

/* 注册“外部”名称,然后是“内部”名称 */
xmlrpc_server_register_method($server, "cycle", "lifecycle");

$request = $HTTP_RAW_POST_DATA; // 你不需要“总是开启”,$_POST 也无效。

/* 此处的参数是“服务器、xml 字符串和用户数据”。应该还有一个可选的“输出选项”数组,但我无法使其工作 :( 因此调用 header() */
$response = xmlrpc_server_call_method($server, $request, null);
header('Content-Type: text/xml');
print
$response;

xmlrpc_server_destroy($server);
?>
1
[email protected]
21 年前
如果有人有兴趣直接从客户端发出 XMLRPC 请求,我已经能够让 xmlrpc 与
vcXMLRPC javascript 后端一起工作。

大约一周的市场扫描后,我发现此解决方案在 Javascript 后端方面是最佳的。它使用 Microsoft.HTTP activeX 控件(用于 IE)或 HTTPRequest 对象(用于 Mozilla)。

你将 vc(Virtual Cowboys)vcXMLRPC.js 文件包含到你的页面中,并使用 javascript 进行 rpc 调用以创建请求。

它双向工作。

两点说明

我在 IE 6.02 上测试过它,你需要更改 ProcessRequest 中的行
函数以读取

dom = this.getObject("XMLDOM",http.responseText);

并更改 getObject 函数以使用最新的 ActiveX 控件

MSXML2.XMLHTTP.3.0(或 4.0)
MSXML2.DOMDocument.3.0(或 4.0)

这些控件可以在 MSDN 的 Web 服务 -> XML 区域找到。

另一点说明,你不需要 rpcproxy.cgi 脚本就能使用它。这是一个绕过 JS 安全性的代理脚本。你可以使用 PHP 来构建代理。但是,我能够在 Solaris 上使用 GCC 编译器使 CGI 工作(更改 Makefile 中的 -KPCI、depend 和 -x03 优化器设置)。
2
匿名
18年前
此 XML-RPC 服务使使用 XML-RPC 非常容易。

<?php

/**
* myfun() 函数返回
*@return array
*/
function myfunc(){
return
$some_array;
}

$ws = new XML_RPC_Server();
$ws->registerFunction('myfunc');
$ws->run();

?>

http://www.pure-php.de/node/31

它还创建了一个简单的文档。
http://www.pure-php.com/php/service.php?doc
2
[email protected]
18年前
如果你需要使用此扩展但被困在一个无法安装它的服务器上,可以在 http://phpxmlrpc.sourceforge.net 找到的 php-xmlrpc 库包含一个模拟层,旨在与原生扩展的 API 完全兼容(作为 0.2 版后的“extras”包的一部分)。
这意味着你的代码应该能够在 php-xmlrpc 库上无修改地运行。当然,性能至少会差一个数量级……
1
[email protected]
17年前
你好,

一个实现面向对象 XML RPC 服务器的小片段。

文件 RPCPlugin.php

class RPCPlugins {

private $plugins;

function __construct ($pathname, $rpcServer) {
$d = dir($pathname);
while (($file = $d->read()) !== false) {
if (ereg('(.*)\.php$', $file, $regs)) {
include_once ($pathname . '/' . $file);
$class=$regs[1];
$this->plugins = new $class($rpcServer);
}
}
}

}

class RPCPlugin {

private $_rpcServer;

function __construct($rpcServer) {
$this->_rpcServer = $rpcServer;

$methods = get_class_methods($this);

foreach ($methods as $method) {
if (substr($method, 0,1) != '_') {
xmlrpc_server_register_method($rpcServer,get_class($this) . "." . $method,array(&$this,$method));
}
}

}

}

插件示例位于 plugins/Test.php

class Test extends RPCPlugin {


function HelloWorld ($method, $params) {
return "Hello World --->>" . $params[0];
}

}

现在是真正的服务器

require_once 'RPCPlugin.php';

$rpcServer = xmlrpc_server_create();

$plugins = new RPCPlugins(realpath('plugins/'), $rpcServer);

$resp = xmlrpc_server_call_method($rpcServer,$HTTP_RAW_POST_DATA,null);
if ($resp) {
header ('Content-Type: text/xml');
echo $resp;
}
xmlrpc_server_destroy($rpcServer)

然后你可以按类名.方法调用方法。
对于这个示例 Test.HelloWorld

Hn'Co
1
[email protected]
19年前
我无法使 'xmlrpc_errors' php.ini 设置产生任何
可感知的效果(PHP 4.3.11),所以我使用了以下代码来报告错误
来自我的 XMLRPC 服务器。希望它对某些人有所帮助。

<?php
function return_xmlrpc_error($errno,$errstr,$errfile=NULL,$errline=NULL
,$errcontext=NULL){
global
$xmlrpc_server;
if(!
$xmlrpc_server)die("错误: ".$errstr." 在 '".$errfile."', 第 ".$errline" 行");

header("Content-type: text/xml; charset=UTF-8");
print(
xmlrpc_encode(array(
'faultCode'=>$errno
,'faultString'=>"来自 ".$_SERVER['HTTP_HOST']. " 的远程 XMLRPC 错误: ".$errstr." 在 ".$errfile.": ".$errline
)));
die();
}
set_error_handler('return_xmlrpc_error');
?>

在我的服务器函数中,我只是触发 trigger_error("message",E_USER_ERROR)]
如果某些操作无法完成。

然后在客户端上,
<?php
$data
=& xmlrpc_decode($response['body']);

if(
xmlrpc_is_fault($data)){
trigger_error($data['faultString'],E_USER_ERROR);
}
?>
1
Jerome Delamarche
20年前
文档缺少一个展示如何在响应中发送错误的示例。以下是操作方法:

$args = array("faultCode" => $errcode, "faultString" => $errmsg);
$resp = xmlrpc_encode_request(NULL,$args);
//echo $resp;
2
hfuecks at pinkgoblin dot com
22年前
此扩展不处理通过 HTTP 发出 XML-RPC 客户端请求的过程;它只准备 XML-RPC 请求负载。

这与许多其他 XML-RPC 实现不同,但它提供了更大的灵活性,允许 SSL 连接、身份验证标头以及通过其他传输方式(如 SMTP)进行 XML-RPC。
2
nic at uklinux dot NOSPAM dot net
22年前
另一个 XML-RPC 实现位于 http://xmlrpc.usefulinc.com - 它用 PHP 编写,因此您可以在没有重新编译 PHP 的服务器上使用它。

nic
0
mboeren at php dot net
20年前
快速补充一下我之前的 xmlrpc_client 类:由于您不能使用包含大写字母的远程方法或子处理程序中的方法(如 'system.listMethods()'),我在类中添加了一个 'call(...)' 方法。

<?php
// 此方法应复制/粘贴到
// xmlrpc_client 类中

function call($function)
{
$return = NULL;
$argv = func_get_args();
array_shift($argv); // 删除函数参数
$this->__call($function, $argv, &$return);
return
$return;
}

// 现在,您也可以执行以下操作
$result = $client->call('system.listMethods');
$sum = client->call('add', '1', '2');
?>
-2
mboeren at php dot net
20年前
我使用以下代码(需要 overload 扩展)来简化客户端开发

<?php
include("utils/utils.php"); // 来自 xmlrpc-epi utils

/*
用法:
$client = new xmlrpc_client("https://127.0.0.1:7080");
print $client->echo('x')."\n";
print $client->add(1, 3)."\n";

*/
class xmlrpc_client
{
var
$url;
var
$urlparts;

function
xmlrpc_client($url)
{
$this->url = $url;
$this->urlparts = parse_url($this->url);
foreach(array(
'scheme', 'host', 'user', 'pass', 'path',
'query', 'fragment')
as
$part) {
if (!isset(
$this->urlparts[$part])) {
$this->urlparts[$part] = NULL;
}
}
}

function
__call($function, $arguments, &$return)
{
$requestprms['host'] = $this->urlparts['host'];
$requestprms['port'] = $this->urlparts['port'];
$requestprms['uri'] = $this->urlparts['path'];
$requestprms['method'] = $function;
$requestprms['args'] = $arguments;
$requestprms['debug'] = 0;
$requestprms['timeout'] = 0;
$requestprms['user'] = NULL;
$requestprms['pass'] = NULL;
$requestprms['secure'] = 0;

$result = xu_rpc_http_concise($requestprms);
if (
is_array($result) && isset($result['faultCode'])) {
print(
'xmlrpc 调用错误 \''.$function.'\''."\n");
print(
' 代码:'.$result['faultCode']."\n");
print(
' 消息:'.$result['faultString']."\n");
return
false;
}
$return = $result;
return
true;
}

}
overload('xmlrpc_client');

?>
-5
ivanr at webkreator dot com
22年前
要轻松使用此 XML-RPC 扩展,请查看

XML-RPC 类服务器 (http://www.webkreator.com/php/xcs/)

它会自动根据 PHP 类创建服务器。创建客户端几乎同样容易,尤其是在 PHP 中最近添加了 overload 扩展之后(参见 https://php.net/manual/en/ref.overload.php)。
To Top